Django自定义Manager在反向关联查询中未过滤关联对象,返回全部数据的问题求助
Django自定义Manager在反向关联查询中未过滤关联对象,返回全部数据的问题求助
大家好,我最近碰到了一个Django自定义Manager的诡异问题,捣鼓半天没摸透原因,来请各位大佬帮忙看看!
我定义了一对1:N关联的模型This和Thing,Thing通过外键关联到This。用默认的反向查询方法this.thing_set.all()时,一切正常,能精准返回属于当前this的所有Thing对象;但我给Thing加了个自定义Manager,想实现按日期排序的功能,结果调用this.thing_set.by_date()时,居然返回了所有Thing的数据,完全没有过滤出关联当前this的对象!
先给大家看一下交互过程:
正常查询(符合预期):
>>> for thing in this.thing_set.all(): ... print(thing.this)输出的每一条结果都是当前的
This对象,完全正确。
自定义方法查询(不符合预期):
>>> for thing in this.thing_set.by_date(): ... print(thing.this)结果居然输出了当前
This和其他That对象关联的Thing,相当于直接返回了全量的Thing数据,完全没做关联过滤!
再贴一下我的模型代码(可能有些小细节写得不够严谨,但核心逻辑是这样的):
from django.db import models class ThingByDateManager(models.Manager): def by_date(self): # 只是调用父类的queryset然后按start_time排序 return super().get_queryset().order_by("start_time") class This(models.Model): name = models.CharField(max_length=255, primary_key=True) class Thing(models.Model): start_time = models.DateTimeField() # 修正了拼写错误,原代码写成了DateTimeFiled name = models.CharField(max_length=255) this = models.ForeignKey(This, on_delete=models.CASCADE) # 用自定义Manager替换默认的objects objects = ThingByDateManager()
我怀疑是不是QuerySet或者Manager的使用哪里犯了低级错误?为什么自定义的方法没有继承反向查询的过滤条件,反而直接返回了所有Thing对象呢?
内容来源于stack exchange




