我有两种模式:
class A(models.Model):
name = models.CharField(max_length=100, unique=True)
class B(models.Model):
a = models.ForeignKey(A)
在Django中,我如何选择具有指向它们的B类对象的类'A'的所有对象?例如,如果数据库包含类'A'的这三个条目:
A, named "one"
A, named "two"
A, named "three"
B类的两个条目:
B, points to "two"
B, points to "three"
我想选择A类的“两个”和“三个”类。
答案 0 :(得分:14)
你可以这样做:
a_qs = A.objects.filter(b = b)
其中b是类B
的对象,b=
指的是要查询反向关系的小写模型名称。
详细了解lookups that span relationships here。它介绍了如何对模型的ForeignKey属性进行反向查找
编辑:
如果您要查找没有的任何ForeignKey
个对象指向它们的所有对象,您可以使用exclude
和__isnull
a_qs = A.objects.exclude(b__isnull = True)
答案 1 :(得分:0)
这对我有用:
a_qs = A.objects.filter(b__a__isnull=False).distinct()
它仅给出A的对象,而B指向该对象。使用a__isnull=False
检查外键是否存在。如果是这样,则按照定义,它只能指向A。使用distinct()
删除重复项。
设置了related_name
参数后,例如
class A(models.Model):
name = models.CharField(max_length=100, unique=True)
class B(models.Model):
a = models.ForeignKey(A, related_name='b_list')
这有效:
a_qs = A.objects.filter(b_list__a__isnull=False).distinct()