【问题标题】:Limit django queryset by another related table通过另一个相关表限制 django 查询集
【发布时间】:2011-02-13 21:40:42
【问题描述】:

假设我有 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')

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    我知道这只是一个示例,但此模型设置实际上并没有按原样验证 - 如果不指定 related_name,就不能有两个单独的 ForeignKeys 指向同一个模型。因此,假设相关名称分别为 egg_parentegg_child,并且您现有的 Spam 对象称为 my_spam,则可以这样做:

    my_spam.egg_parent.child_spam.all()
    

    Spam.objects.filter(egg_child__parent_spam=my_spam)
    

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

    my_spam.other_spams.all()
    

    【讨论】:

    • 第一种方法给了我一个 italic 'RelatedManager' 对象没有属性 'child_spam' 异常。_italic_ 第二种方法就像一个魅力。第三个是不可行的,因为我想在“鸡蛋”中包含其他字段,所以它不仅仅是一个链接表。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-07
      • 2020-10-08
      • 2021-10-15
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多