首页 > 解决方案 > django orm 按相关日期字段过滤和排除

问题描述

模型.py

class Model(models.Model):
    ...


class RelatedModel(models.Model):
    model = models.ForeignKey(Model, related_name="related_model")
    date = models.DateField()


我想DateField按月和年过滤对象。

有什么解释吗?

谢谢。


文档中的答案:

诺塔

如上所述,对于跨越多值关系的查询,filter() 的行为并不等同于 exclude()。相反,单个 exclude() 调用中的条件不一定引用同一个项目。

例如,以下查询将排除同时包含标题中带有 «Lennon» 的条目和 2008 年发布的条目的博客:

Blog.objects.exclude(entry__headline__contains='Lennon', entry__pub_date__year=2008, )

但是,与使用 filter() 时的行为不同,这不会根据满足这两个条件的条目来限制博客。为了做到这一点,即选择所有不包含在 2008 年发布的以 «Lennon» 发布的条目的博客,您需要进行两个查询:

Blog.objects.exclude(entry__in=Entry.objects.filter(headline__contains='Lennon', pub_date__year=2008, ), )

标签: djangodjango-modelsorm

解决方案


有多个RelatedModel相同的实例,Model其中一个可以有month=6,另一个可以有year=2021。排除也会消除这些

记录的那样,您将必须准确过滤具有这两种条件的实例

Model.objects.exclude(
    related_model__in=RelatedModel.objects.filter(
        related_model__date__month=6,
        related_model__date__year=2021,
    ),
)

推荐阅读