You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django自定义Manager在反向关联查询中未过滤关联对象,返回全部数据的问题求助

Django自定义Manager在反向关联查询中未过滤关联对象,返回全部数据的问题求助

大家好,我最近碰到了一个Django自定义Manager的诡异问题,捣鼓半天没摸透原因,来请各位大佬帮忙看看!

我定义了一对1:N关联的模型ThisThingThing通过外键关联到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

火山引擎 最新活动