2018-10-04-Python全栈开发-day61-DJANGO-MODELS操作补充
1.select_related()
1. 我们基于以下模型来分析select_related的作用。 class Person(models.Model); name = models.CharField(max_length=30) age = models.IntegerField() class Book(models.Model): person = models.ForeignKey(Person) title = models.CharField(max_length=50) pubtime = models.DateField()123456789 2. 模型结构为: Book - title - page - person -> ForeignKey(Person)123 3. 两种查询方式: A. 不带select_related book = Book.objects.filter(pk=1) # 需要查询数据库 1 --------------------- result: book - id - title - page - Person.id --------------------- n = book.name # 需要查询数据库 2 a = book.age # 需要查询数据库 312345678910 *总共向数据库发起三次查询。 B. 带select_related book = Book.objects.select_related().filter(pk=1) # 需要查询数据库 1 --------------------- result: book - id - title - page - Person - id - name - age --------------------- n = book.name # 直接从book对象中取 a = book.age # 直接从book对象中取123456789101112 *总共向数据库发起一次查询。 也就是说使用select_related()方法一次性的把Book关联的对象都查询出来放入对象中,再次查询时就不需要再连接数据库,节省了后面查询数据库的次数和时间。 --------------------- 本文来自 Nick_Spider 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_39198406/article/details/78845122?utm_source=copy
p=f1.objects.select_related('name).all()===得到的是f1中name外键对应表的所有数据,得到的是一个对象,再次从中取数据时可以直接取,减少了取值次数
2.distinct去重
f1.objects.values('name').dictinct()
3.order by排序
4.extra自定制sql语句
## select提供简单数据 # SELECT age, (age > 18) as is_adult FROM myapp_person; Person.objects.all().extra(select={'is_adult': "age > 18"}) # 加在select后面 ## where提供查询条件 # SELECT * FROM myapp_person WHERE first||last ILIKE 'jeffrey%'; Person.objects.all().extra(where=["first||last ILIKE 'jeffrey%'"]) # 加一个where条件 ## table连接其它表 # SELECT * FROM myapp_book, myapp_person WHERE last = author_last Book.objects.all().extra(table=['myapp_person'], where=['last = author_last']) # 加from后面
5.only只选取某列
f1.object,only('name')
6.defer除了某列
f1.objects.defer(''name)
7.using选择使用的数据库
f1.objects.all().using(default)
补充操作2
queryset方法
1.dates时间
dates(self,field_name,kind,order='ASC',tzinfo='none') 从数据库中找到含有时间的字段,然后截取为固定格式 kind=yesr(年),month(年-月),day(年-月-日) order =asc或者pesc datestimes(self,field_name,kind,order='ASC',tzinfo='none') 可以指定转换时间
2.aggregate只获取某一列
3.bulk_create批量创建数据
4.update_or_create
修改或者创建
5.