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.