Djangoのモデル
modelの共通フィールド
クラシックシナリオの例
書籍、著者、出版社の関係、ここではプレゼンテーションを容易にするために、表のフィールドをできるだけ簡素化し、書籍表には書名があり、出版社と出版社表は一対多の関係を確立し、1冊の本は複数の著者を持つことができ、また著者表と多対多の関係を構築することができる[many-to-many].著者表には名前、年齢、出版社の表に出版社の名前があります.
オブジェクトの選択全オブジェクト を取得する.フィルタ対象 単一オブジェクト を取得する.オブジェクトソート 連査 一括更新 削除オブジェクト
外部キーとマルチペアマルチアクション外部キー へのアクセス逆クエリ マルチペアマルチオペレーション
カスタムモデルメソッド
実行結果:
カスタムmanagerマネージャ
実行結果:
カスタムsql文
実行結果:
フィールドをフィルタする方法
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