python学习:Django的Model补充(11)

Django的Model补充

        Modle的定义外键属性的参数。简单写法直接写表名,on_delete:删除时是否级联。也可以定义时,设置各种属性。

示例:

publish = models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)

#to:设置外键表名

#to_field:设置外键关联栏位

#on_delete:设置删除时操作,

#models.CASCADE:级联删除;

#models.DO_NOTHING:删除时报错

#models.PROTECT:删除时保错

#models.SET_NULL:删除关联数据时,与之关联的变成NULL

#models.SET_DEFAULT:删除时,设置默认值

#models.SET:删除时,删除关联数据,设置成指定值,models.SET(指定值),或者models.SET(func())设置关联值为func()返回值。

#related_name:设置反向查找时使用的属性名,默认是表名_set代表对应表。

#related_query_name:设置反向查询的表名,表名__字段名

#limit_choices_to:筛选外键关联查询出的数据,只在admin中生效。例如:limit_choices_to={"id__gt" : 1},将id大于1的数据筛选出来,当admin添加数据时,设置关联字段值,会做筛选。

#db_constraint:False or True是否数据库中创建外键约束

#parent_link:False or True 在admin中是否显示关联数据

 

 

多对多关系建立额外属性设置:

使用ManyToManyField定义多对多关系

#进阶设置

author = models.ManyToManyField(

    #关联表

    to="Author",

    #是否创建外键约束

    db_constraint=True,

    #设置第三张表名

    db_table=None,

    #through,不自动创建第三张表,指定自己创建的Book_Author表

    through="Book_Author",

    through_fields=["book","author"]

)

 

db_table:设置第三张数据关系表表名,默认是两个关联表:表1_表2

        默认设置ManyToMany字段后,Django自动创建第三张关系表,但是这张表只能有三个字段,我们如果需要其他字段,需要自己建立第三张表。

示例:

class Book_Author(models.Model):

    book = models.ForeignKey("Book",on_delete=models.CASCADE);

    author = models.ForeignKey("Author",on_delete=models.CASCADE);

    #设置多个字段联合唯一,设置多个字段作为主键

    class Meta:

        unique_together=[

            ("book","author")

        ]

through:None,ManyToMany创建第三张表时,将第三张表指定为自己创建的表。这里可以指定through:Book_Author,

through_fields:None,指定关联字段,through_field:[“book“,“author”]

 

表的自关联

        多对多:表的ManyToManyField字段是自己本身。一对多也可以自关联,ForeignKeyField是字段本身。

示例:

class Book(models.Model):

    name = models.CharField(max_length=20,verbose_name="名称");

    price = models.FloatField();

    b = models.ManyToManyField("Book");

 

select_related函数:

Book表和Publish表是一对多关系,一本书对应一个出版社,一个出版社对应多本书。其中publish是Book表中外键。

查询关联字段,一次性查询出来,执行SQL语句

book_list = Book.object.all()

#这里通过对象获取Publish表数据,这里会执行SQL语句

#如果循环获取,会执行多次SQL,效能极差

book_list.publish.name

#使用select_related(外键栏位),一次性连接查询出来,可以传入多个外键栏位

book_list = Book.object.select_related(“publish”)

 

prefetch_related函数:

#使用prefetch_related(外键栏位),一次性连接查询出来,可以传入多个外键栏位

book_list = Book.object.prefetch_related(“publish”)

 

only函数和defer函数:

        使用only只取指定列,效果和values类似,但only返回结果QuerySet中依然是对象列表

        book_list = Book.object.only(“id”,”name”)

        使用defer不取指定列

        book_list = Book.object.defer(“id”)

 

using函数:

        通过using(“别名”),查询指定数据库。

在setting.py中,using(“default”)。如果有另外一个“default1”的数据库,我们就可以使用using(“default1”)查询另一个数据库。

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.sqlite3',

        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),

    }

}

 

 

extra函数:

         通过extra可以执行额外的子查询。

         Book.objects.extra(select = {“new_id”: “select id from Book where id > %s”},select_params = (10,))

         #where条件

         Book.objects.extra(where = [“name=’tang’”,”age > 10”])

 

raw函数:

   使用raw函数直接执行sql语句,

   Book.objects.raw(“select id name from book”);

   使用參數为原生SQL赋值

   Book.objects.raw(“select * from book where id > %s”,params=[10,])

   将获取的列名对应其他名

   name ={“id’:”ID”,”name”:”名称”,”price”:”价格”}

   Book.objects.raw(“select id name price from book”,translations=name)

   使用数据库指定,使用默认default数据库

   Book.objects.raw(“select * from book”,using =”default”)

 

dates函数:

   获取时间栏位部分信息

   dates(self,field_name,kind,order=’ASC’)

   kind参数:year:年  month:年-月 day:年-月-日

   Date.objects.dates(“time”,year,”DESC”)

 

datetimes函数:

  获取时间栏位部分信息,年月日时分秒;

  Datetimes(self,field_name,kind,order,tz_info=None)

  Kind参数:year(年),month(月),day(日),hour(时),minute(分),second(秒)

  tzinfo:时区对象,pytz.timezone(“时区字符串”);

  使用pip3 install pytz

  import pytz

  #显示时区字符串

  pytz.all_timezones

 

 

none函数:

  获取空的QuerySet对象。

 

bulk_create函数:

  批量创建记录,

  bulk_create(self,objs,batch_size=None)

  objs:对象列表,批量创建记录

  batch_size:最大批量数

  objs[Book(name=”天下”),name=”传奇”]

  Book.objects.bulk_create(objs,10);

 

get_or_create函数:

  获取记录,如果没有创建后再获取。

  obj,created = Book.objects.get_or_create(id=”2”,defaults={name=”test”,price=11})

 

update_or_create函数:

  更新记录,如果记录存在就根据defaults参数更新,不存在就创建。

  obj,created=

Book.objects.update_or_create(id=”2”,defaults={name=”test”,price=11})

posted @ 2020-12-19 14:35  渔歌晚唱  阅读(161)  评论(0)    收藏  举报