通过另一个相关表限制django查询集
假设我有两个django模型,如下所示:通过另一个相关表限制django查询集,django,django-models,Django,Django Models,假设我有两个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字段
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\u spam字段
- 并返回一组“垃圾邮件”对象
SELECT * FROM Spam WHERE id IN (SELECT child_spam FROM Eggs WHERE parent_spam = 'input_id')
我知道这只是一个示例,但此模型设置实际上并没有进行验证-如果不指定
相关的\u名称
,就不能让两个单独的外键指向同一个模型。因此,假设相关的名称分别为egg\u parent
和egg\u child
,并且您现有的垃圾邮件对象称为my\u Spam
,则可以:
my_spam.egg_parent.child_spam.all()
或
更好的是,在垃圾邮件模型上定义一个ManyToManyField('self')
,它可以为您处理所有这些,然后您可以执行以下操作:
my_spam.other_spams.all()
我知道这只是一个示例,但此模型设置实际上并没有进行验证-如果不指定
相关的\u名称
,就不能让两个单独的外键指向同一个模型。因此,假设相关的名称分别为egg\u parent
和egg\u child
,并且您现有的垃圾邮件对象称为my\u Spam
,则可以:
my_spam.egg_parent.child_spam.all()
或
更好的是,在垃圾邮件模型上定义一个ManyToManyField('self')
,它可以为您处理所有这些,然后您可以执行以下操作:
my_spam.other_spams.all()
根据您的sql代码,您需要这样的代码
Spam.objects.filter(id__in= \
Eggs.objects.values_list('child_spam').filter(parent_spam='input_id'))
根据您的sql代码,您需要这样的代码
Spam.objects.filter(id__in= \
Eggs.objects.values_list('child_spam').filter(parent_spam='input_id'))
第一种方法为我提供了一个斜体的“RelatedManager”对象,它没有属性“child\u spam”异常。第二种方法的效果很好。第三个是不可行的,因为我想在“鸡蛋”中包含其他字段,所以它将不仅仅是一个链接表。谢谢第一种方法为我提供了一个斜体的“RelatedManager”对象,它没有属性“child\u spam”异常。第二种方法的效果很好。第三个是不可行的,因为我想在“鸡蛋”中包含其他字段,所以它将不仅仅是一个链接表。谢谢