从父查询集中过滤多对多对象

时间:2021-04-01 04:32:25

标签: django django-models django-views

我有两个这样的模型

class A(models.Model):
    x = models.CharField(blank=True, null=True, max_length=256)
    y = models.CharField(blank=True, null=True, max_length=256)

class B(models.Model):
    m = models.ManyToManyField(to=A, blank=True)
    #other fields

class C(models.Model):
    p = models.ManyToManyField(to=A, blank=True)
    #other fileds

现在当我使用 query_b = models.B.objects.all()

我想从多对多查询集中排除这些对象,而不是 query_b 对象 'm',如果它们存在于 models.C.objects.all() 中并返回 query_b

2 个答案:

答案 0 :(得分:0)

请试试这个并告诉我们,

query_b = models.B.objects.all()
for instances in query_b:
    if(C.objects.filter(id=instances.id).exists()):
        query_b.remove(instances)

现在 query_B 将只有 B 的实例,不包括 C

答案 1 :(得分:0)

如果我猜对了 - 首先查询 A 引用的所有可能的 C 对象,然后将它们从您的最终查询中排除:

queryset = models.C.objects.filter(p__isnull=False).values_list('p', flat=True).distinct()
query_b = models.B.objects.exclude(m__in=queryset)