Djangoのモデル

6003 ワード

modelの共通フィールド
V=models.CharField(max_length=None[, **options])    #varchar
V=models.EmailField([max_length=75, **options])    #varchar
V=models.URLField([verify_exists=True, max_length=200, **options])    #varchar
V=models.FileField(upload_to=None[, max_length=100, **options])    #varchar
#upload_to          ,
V=models.ImageField(upload_to=None[, height_field=None, width_field=None, max_length=100, **options])
V=models.IPAddressField([**options])    #varchar
V=models.FilePathField(path=None[, match=None, recursive=False, max_length=100, **options]) #varchar
V=models.SlugField([max_length=50, **options])    #varchar,  ,    
V=models.CommaSeparatedIntegerField(max_length=None[, **options])    #varchar
V=models.IntegerField([**options])    #int
V=models.PositiveIntegerField([**options])    #int    
V=models.SmallIntegerField([**options])    #smallint
V=models.PositiveSmallIntegerField([**options])    #smallint    
V=models.AutoField(**options)    #int; Django      
V=models.DecimalField(max_digits=None, decimal_places=None[, **options])    #decimal
V=models.FloatField([**options])    #real
V=models.BooleanField(**options)    #boolean bit
V=models.NullBooleanField([**options])    #bit        null 
V=models.DateField([auto_now=False, auto_now_add=False, **options])    #date
#auto_now         ;auto_now_add       
V=models.DateTimeField([auto_now=False, auto_now_add=False, **options])    #datetime
V=models.TimeField([auto_now=False, auto_now_add=False, **options])    #time
V=models.TextField([**options])    #text
V=models.XMLField(schema_path=None[, **options])    #text
——————————————————————————–
V=models.ForeignKey(othermodel[, **options])    #  ,      ,      
V=models.ManyToManyField(othermodel[, **options])    #   ,      ,     
V=models.OneToOneField(othermodel[, parent_link=False, **options])    #   ,       

クラシックシナリオの例
書籍、著者、出版社の関係、ここではプレゼンテーションを容易にするために、表のフィールドをできるだけ簡素化し、書籍表には書名があり、出版社と出版社表は一対多の関係を確立し、1冊の本は複数の著者を持つことができ、また著者表と多対多の関係を構築することができる[many-to-many].著者表には名前、年齢、出版社の表に出版社の名前があります.
from django.db import models
class Publisher(models.Model):
    name = models.CharField(max_length=30)
 
    def __str__(self):
        return self.name
 
class Author(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
 
    def __str__(self):
        return self.name
 
class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE)
 
    def __str__(self):
        return self.title

オブジェクトの選択
  • 全オブジェクト
  • を取得する.
    Publisher.objects.all() #      
  • フィルタ対象
  • Publisher.objects.filter(name='       ') #          
    dict = {'name':'lemon','age':18}
    Author.objects.filter(**dict) #       
  • 単一オブジェクト
  • を取得する.
    Publisher.objects.get(name='       ') #      !!!
  • オブジェクトソート
  • Author.objects.order_by("name","-age") #          ,-       
  • 連査
  • Author.objects.filter(name='lemon').order_by('-age')[0] 
  • 一括更新
  • Author.objects.all().update(age='18')
  • 削除オブジェクト
  • Author.objects.filter(name='lemon').delete()

    外部キーとマルチペアマルチアクション
  • 外部キー
  • へのアクセス
    Book.objects.get(id=1).publisher #        
  • 逆クエリ
  • models.Publisher.objects.get(id=1).book_set.all() #    ,      queryset    
  • マルチペアマルチオペレーション
  • Book.objects.get(id=1).authors.all() #  queryset    

    カスタムモデルメソッド
    class Author(models.Model):
        name = models.CharField(max_length=30)
        age = models.IntegerField()
    
        def __str__(self):
            return self.name
        def status(self):
            if self.name=='lemon':
                return '  '

    実行結果:
    aa = models.Author.objects.get(id=1)
    print(aa.status())
    ———————————————    ——————————————————
      

    カスタムmanagerマネージャ
    class AuthorManager(models.Manager):
        def name_count(self,str_name):
            return self.filter(name__icontains=str_name).count()
    class Author(models.Model):
        name = models.CharField(max_length=30)
        age = models.IntegerField()
    
        def __str__(self):
            return self.name
        def status(self):
            if self.name=='lemon':
                return '  '
        #          ,                  
        objects = models.Manger() #     
        object=AuthorManager() #      

    実行結果:
    aa = models.Author.object.name_count('lemon')
    print(aa) #——————》2

    カスタムsql文
    class AuthorManager(models.Manager):
        def age_stat(self, age_int):
            cursor = connection.cursor()
            cursor.execute("""
                SELECT NAME
                FROM app2_author
                WHERE age = %s""", [age_int])
            #fetchall()         
            return [row[0] for row in cursor.fetchall()]
            
    class Author(models.Model):
        name = models.CharField(max_length=30)
        age = models.IntegerField()
        # objects =models.Manager()
        object=AuthorManager()
        def __str__(self):
            return self.name

    実行結果:
    aa = models.Author.object.age_stat(18)
    print(aa)
    -----------------
    ['lemon', 'Luouo']

    フィールドをフィルタする方法
    __exact      like 'aaa'
     __iexact            ilike 'aaa'
     __contains    like '%aaa%'
     __icontains          ilike '%aaa%',    sqlite  ,contains        icontains。
    __gt   
    __gte     
    __lt   
    __lte     
    __in      list   
    __startswith  ...  
    __istartswith  ...        
    __endswith  ...  
    __iendswith  ...  ,     
    __range  ...   
    __year        
    __month        
    __day       
    __isnull=True/False