Django - 可以通过Django的模型快速编写这个查询吗?

时间:2012-01-26 07:28:50

标签: python django django-models

我在Django中设置了这些模型:

class SourceBusiness(models.Model):
    source = models.CharField(max_length=100)
    ...(other fields)

class ResultBusiness(models.Model):
    sourcebusiness = models.ForeignKey(SourceBusiness)
    ...(other fields)

我想获得ResultBusiness表中存在哪些对象的不同来源列表。例如,对于以下数据,

a = SourceBusiness(source="A")
a1 = SourceBusiness(source="A")
b = SourceBusiness(source="B")
c = SourceBusiness(source="C")

x = ResultBusiness(sourcebusiness=a)
y = ResultBusiness(sourcebusiness=a1)
z = ResultBusiness(sourcebusiness=c)

我想找到源a,a1和c的ResultBusinesses,并且这些SourceBusinesses的源是“A”和“C”。理想情况下,我想一步到位[“A”,“C”]。这是否可以使用Django QuerySet API?

如果不是直截了当我可以解决,只想知道是否可以一步完成。

编辑:只是为了澄清,[“A”,“C”]是我想要的结果,而不是输入。因此,不是“哪个ResultBusiness来源于[A,C]中包含源的SourceBusiness”,而是“对于存在的所有ResultBusinesses,其父源SourceBusiness.source的可能值是什么”

3 个答案:

答案 0 :(得分:3)

results = SourceBusiness.objects.filter(resultbusiness__isnull=False).distinct().values_list('source', flat=True)

答案 1 :(得分:1)

RB=ResultBusiness.objects.exclude(sourcebusiness__isnull=True).values_list('sourcebusiness__source',flat=True).distinct()

这是一步到位的事。

假设:ForeignKey可以是null=True

答案 2 :(得分:1)

阅读https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects主题,了解如何进行此类查询。

你应该这样做:

from django.db.models import Q

q = ResultBusiness.objects.filter(
   Q(sourcebusiness__source="A")|Q(sourcebusiness__source="C")
)