Django中想要把模型类聚合得到想要的数据可以用F对象。
成都创新互联公司专业为企业提供平罗网站建设、平罗做网站、平罗网站设计、平罗网站制作等企业网站建设、网页设计与制作、平罗企业网站模板建站服务,十多年平罗做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。比如有模型类A和B,A和B之间有外键关联在一起,A是子表,B是父表(反过来没试过。。因为大部分数据都是用子表的,我想是可以的),那么可以这样查:
A.objects.filter(userid=3,bookid=F(bid))
其中userid,bookid是模型类A的字段,bid是模型类B的字段。
这样操作的结果就是可以查询到userid为3且模型类A字段bookid等于模型类B字段bid的集合数据了。
F对象是可以比较两个关联模型类的字段数据的。
我看到网上有说F对象可以这样用F('b__id') ==>F('模型类名小写__字段名'),此处是双下划线。
但是我用Django2.0时会报错。。真是搞不懂,后来我直接使用字段名居然可以,醉了。
反正都可以试试吧
A.objects.filter(userid=3,bookid=F(bid))
A.objects.filter(userid=3,bookid=F('b__bid'))
补充知识:Django Admin页面显示父表,编辑子表
默认情况下,ModelAdmin只允许您管理模型“本身”字段,而不是相关模型.以下方法将实现,在应用类的列表管理显示页面,显示父表的字段;在编辑页面,父表对子表进行编辑.
models.py如下
class Level(models.Model): # l_num = models.IntegerField(default=0, verbose_name='序号') name = models.CharField(max_length=20) is_delete = models.BooleanField(default=False) def __str__(self): return self.name class Grades(models.Model): name = models.CharField(max_length=20, verbose_name='班级') # 外键,这里关联模型Level与模型名称一样,不是全小写。 level = models.ForeignKey('Level', on_delete=models.DO_NOTHING) is_delete = models.BooleanField(default=False) def __str__(self): return '%s%s' % (self.level, self.name) class Students(models.Model): name = models.CharField(max_length=20, db_index=True, verbose_name='姓名') age = models.IntegerField(verbose_name='年龄') # 需要先提供一个二维的二元元组,第一个元素表示存在数据库内真实的值,第二个表示页面上显示的具体内容 SEX_CHOICE = ( ('男', '男'), ('女', '女'), ) sex = models.CharField(max_length=10, choices=SEX_CHOICE, verbose_name='性别', default='男') grade = models.ForeignKey('Grades', on_delete=models.DO_NOTHING, verbose_name="班级") img_student = models.ImageField(upload_to='img_student', default='img_student/default.png', verbose_name='头像') create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') last_update_time = models.DateTimeField(auto_now=True, verbose_name='上次更新时间') is_delete = models.BooleanField(default=False) def __str__(self): return self.name