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})
本文来自博客园,作者:渔歌晚唱,转载请注明原文链接:https://www.cnblogs.com/tangToms/articles/14159037.html

浙公网安备 33010602011771号