通过另一个相关表限制django queryset

时间:2011-02-13 21:40:42

标签: django django-models

假设我有2个这样的django模型:

class Spam(models.Model):
    somefield = models.CharField()

class Eggs(models.Model):
    parent_spam = models.ForeignKey(Spam)
    child_spam = models.ForeignKey(Spam)

鉴于输入“垃圾邮件”对象,django查询将如何显示:

  • 根据“Eggs”表中的parent_spam字段限制此查询
  • 给我相应的child_spam字段
  • 并返回一组“垃圾邮件”对象

在SQL中:

SELECT * FROM Spam WHERE id IN (SELECT child_spam FROM Eggs WHERE parent_spam = 'input_id')

2 个答案:

答案 0 :(得分:1)

我知道这只是一个例子,但是这个模型设置实际上并没有实际验证 - 你不能指定两个单独的ForeignKeys指向同一个模型而不指定related_name。因此,假设相关名称分别为egg_parentegg_child,并且您现有的垃圾邮件对象名为my_spam,则可以执行此操作:

my_spam.egg_parent.child_spam.all()

Spam.objects.filter(egg_child__parent_spam=my_spam)

更好的是,在垃圾邮件模型上定义一个ManyToManyField('self'),它会为你处理所有这些,然后你会这样做:

my_spam.other_spams.all()

答案 1 :(得分:0)

根据你的sql代码,你需要这样的东西

Spam.objects.filter(id__in= \
    Eggs.objects.values_list('child_spam').filter(parent_spam='input_id'))