Django:查询所有具有外键的项目

时间:2013-11-15 17:12:47

标签: django

我有两种模式:

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类的“两个”和“三个”类。

2 个答案:

答案 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()