Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过另一个相关表限制django查询集_Django_Django Models - Fatal编程技术网

通过另一个相关表限制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字段

假设我有两个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\u spam字段
  • 并返回一组“垃圾邮件”对象
在SQL中:

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”异常。第二种方法的效果很好。第三个是不可行的,因为我想在“鸡蛋”中包含其他字段,所以它将不仅仅是一个链接表。谢谢