在ManyToMany关系中检查对象是否存在(Django)

时间:2011-12-11 03:46:26

标签: django django-models

我想在ManyToMany关系中检查特定对象的存在。例如:

class A(models.Model):
    members = models.ManyToManyField(B)

class B(models.Model):
    pass

results = [some query]

for r in results:
    print r.has_object // True if object is related to some B of pk=1

我在[some query]的第一次尝试是A.objects.all().annotate(Count(has_object='members__id=1')),但看起来我不能在Count的参数中添加任何字段名称。还有其他方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:11)

你可以尝试

A.objects.filter(members__id=1).exists()

答案 1 :(得分:2)

我很确定在1.4中实现many-to-many prefetching之前,在纯Python中没有任何可行的方法可以做到这一点

与此同时,这就是我通过下载到SQL中的方式:

results = A.objects.all().extra(
    select={
        'has_object': 'EXISTS(SELECT * FROM myapp_a_members WHERE a_id=myapp_a.id AND b_id=1)'
    }
)

当然,更简单的方法就是重构代码以在两个独立的查询集上运行:

results_with_member_1 = A.objects.filter(members__id=1)
results_without_member_1 = A.objects.exclude(members__id=1)