django orm 补充

a 需求

一般我们都是这样表的某几列

models.User.objects.all().values("id","name")

quertset = [{},{}]

或者

models.User.objects.all().values_list("id","name")

quertset = [(),()]

现在我们可以用

models.User.objects.all().only("id","name")

quertset = [obj,obj]

取得都是对象,对象里存储着你所需的字段

通过遍历获取

如果你遍历的对象属性不在only里,它会自动从数据库里查询

比如遍历的属性有age,而age不在only里,它会自动从数据库里查询

models.User.objects.all().defer("id","name")

排除id,name

b 需求

查询所有的用户姓名和部门名称

class depart:

      title = ....

class User:

      name = .....

dp = FK(depart)

一般我们可能会这样操作

result = models.User.objects.all()

for item in result:

        print(item.name,item.dp.title)

这样操作性能低

这样做的sql语句为 select * from user先查询用户表,然后通过item.dp.title再做一次查询,如果遍历十次就需要查询depart表十次.

总共十一次.

result = models.User.objects.all().selected__related("dp")主动创建关联关系,

相当于select * from user left join depart on user.dp_id = depart.id,主动做连表

用在一对一,一对多

for item in result:

        print(item.name,item.dp.title)

查询次数为一次

缺点:如果连表越多性能越差

prefetch_related:两次单表查询

#select * from user

#通过python代码获取所有的dp_id = [1,2]

#select * from depart where id in de_id

result = models.User.objects.all().prefetch_related("dp")

for item in result:

        print(item.name,item.dp.title)

支持多对多

数据冗余:

      外键的作用是节省硬盘资源

       如果数据量比较大可以不设置外键,提高查询速度,单表查询比连表查询速度快,用空间换时间

猜你喜欢

转载自blog.csdn.net/u014248032/article/details/88658393