查询集中相关manytomany字段的具体加载

时间:2018-06-06 14:19:32

标签: django many-to-many django-queryset django-orm

我正在使用具有多对多关系的额外字段的中间模型,如下所示:

Map

默认情况下,class A(models.Model): name = models.CharField(max_length=128) class B(models.Model): name = models.CharField(max_length=128) a = models.ManyToManyField(A, through='AB') class AB(models.Model): a = models.ForeignKey(A, on_delete=models.CASCADE) b = models.ForeignKey(B, on_delete=models.CASCADE) number = models.IntegerField(default=0) date = models.DateTimeField() 在数据库中为NULL。

我使用AB.date之类的内容检索我的所有B个实例。

然后,对于B.objects.all()的每个实例,我都可以获得一组BAB

如何只加载b_instance.ab_set.all()为空的ab_set个元素?

在SQL中它看起来像这样:

date

2 个答案:

答案 0 :(得分:1)

您可以使用__isnull [doc] 字段查找执行过滤,例如:

b_instance.ab_set.filter(date__isnull=True)

通过指定.filter(..)字段date,我们在集合上isnull

或者,如果您例如想要使用非None date进行查询,则可以使用date=None进行过滤:

b_instance.ab_set.filter(date=None)

答案 1 :(得分:0)

通过对我的问题的一些研究,我终于找到了可以解决问题的东西。

我使用Model method来过滤我的一组对象:

class B(models.Model):
    ...
    def get_ab_with_null_date(self):
        return self.ab_set.filter(date__isnull=True)

所以,我可以在我的模板中过滤ab_set,如下所示:

{% for b in list_of_B %}
    {% for ab in b.get_ab_with_null_date %}
        ...
    {% endfor %}
{% endfor %}
  

您认为有更有效的方法来执行此操作吗?

另外,我看到有关覆盖Manager的事情 像这样:

b = B.objects.get(...)
b.custom_manager.get_ab_with_null_date() # return filtered ab_set with null date

由于我没有直接在视图中操纵我的ab_set,我认为这对我的情况不太有用。