暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

orm多对多中filter和values查询总结

大碗岛星期天下午的梦 2019-11-26
917


上篇说了orm中内置了一个object对象,所有的查询要先通过object,之后的筛选过滤等方法中,常用的有filter和values。今天不扯原理,只讲使用方法。


我们都知道orm本质是将SQL转化为类属性操作,也就是说代码中的方法是跟SQL是可以对应上的。


from django.db import models


class Premission(models.Model):
title = models.CharField(verbose_name='权限名称',max_length=32)
url = models.CharField(verbose_name='权限url',max_length=128)


def __str__(self):
return self.url


class Role(models.Model):
name = models.CharField(verbose_name='角色名称',max_length=32)
premission = models.ManyToManyField(verbose_name='角色权限',to=Premission)


def __str__(self):
return self.name


class User(models.Model):
user = models.CharField(verbose_name='用户名',max_length=32,blank=True,null=True)
password = models.CharField(verbose_name='用户密码',max_length=32,blank=True,null=True)
role = models.ManyToManyField(verbose_name='用户角色',to=Role)


def __str__(self):
return self.user
复制


filter()

相当于sql中的WHERE,区别是sql得到确切的数据,orm得到数据的映射。不完全准确,勿喷。


orm:
models.User.objects.filter(user='luka')
sql:
SELECT * FROM User WHERE user= 'luka';
复制


values()

一种相当于sql中的WHERE和from之间,另一种情况可通过双下划线实现跨表查询(例子3)


例子1:
orm:
models.User.objects.values()
SQL:
SELECT * FROM User ;


例子2:
orm:
models.User.objects.values('password')
SQL:
SELECT password FROM User ;


例子2:
orm:
models.User.objects.filter(user='luka').first().values('role__name')
SQL:
SELECT Role.name FROM Role,(SELECT * FROM User WHERE user = 'luka') AS ret WHERE Role.role_id=ret.user_id;
复制


filter()和values()的区别在于,filter返回对象,而values返回字典。一般情况下,我们要的最终查询结果是字典这样确切的数据,而不是一个确切结果的映射。


the end


张杰挺好的,不知道为什么这么多人喷他

这战场千百热血战士

一路向前飞驰

捍卫世界的勇士


文章转载自大碗岛星期天下午的梦,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论