在Django中获取唯一的外键?

时间:2009-11-29 19:55:35

标签: python django django-models

假设我的模型如下:

class Farm(models.Model):
   name = ...

class Tree(models.Model):
   farm = models.ForeignKey(Farm)

...我得到QuerySetTree个对象。如何确定QuerySet中代表哪些农场?

3 个答案:

答案 0 :(得分:6)

http://docs.djangoproject.com/en/dev/ref/models/querysets/#in

Farm.objects.filter(tree__in=TreeQuerySet)

答案 1 :(得分:4)

使用Django ORM可能有更好的方法来保持懒惰,但你可以通过常规python获得你想要的东西(在我的头顶):

>>> set([ t.farm for t in qs ])

答案 2 :(得分:0)

以下是让数据库为您完成工作的方法:

farms = qs.values_list('farm', flat=True).distinct() 
#values_list() is new in Django 1.0

返回值应评估为:

(<Farm instance 1>, <Farm instance5>)

农场将是那个在特定查询集中有树的农场。

对于所有拥有树木的农场,请使用qs = Tree.objects

请记住,如果添加order_by('some_other_column'),则distinct将应用于'farm'和'some_other_column'的不同组合,因为其他列也将在sql查询中进行排序。我认为它是api中的一个限制(不是预期的功能),它在documentation中有描述。