Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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
Python Django满足特定条件的多对多查询_Python_Django_Many To Many - Fatal编程技术网

Python Django满足特定条件的多对多查询

Python Django满足特定条件的多对多查询,python,django,many-to-many,Python,Django,Many To Many,我有这两种型号 class Genre( TimeStampAwareModel ): genre = models.CharField ( max_length = 255, blank = False ) parent = models.ForeignKey ( 'self', null=True, blank=True, related_name = "childs" ) .. class Track( TimeStampAwareModel ): ....

我有这两种型号

class Genre( TimeStampAwareModel ):
   genre = models.CharField ( max_length = 255, blank = False )
   parent = models.ForeignKey ( 'self', null=True, blank=True, related_name = "childs" )
   ..
class Track( TimeStampAwareModel ):
   ....
   genre = models.ManyToManyField( Genre )
因为流行音乐和摇滚乐也有子类型,所以我有一个类型[流行音乐,摇滚音乐,…]的输入列表。现在我想过滤满足以下条件的所有轨迹

(G1parent或G1child1或G1child2或……)和(G2parent或G2child1或G2child2或……)

这里G1父母是流行音乐,G2父母是摇滚乐,我怎么能得到这个?寻找一个优雅的解决方案


谢谢

如果我正确理解你的意思,你希望所有的曲目要么是“摇滚”类型的曲目,要么是以“摇滚”为母体的曲目。如果是:

from django.db.models import Q

Track.objects.filter(Q(genre__genre='Rock') | Q(genre__parent__genre='Rock')).distinct()
编辑

事实上,在重读这个问题之后,你似乎想要我说的话,但是要同时列出一个流派列表,而不是一次只列出一个。为此,只需调整上述代码,如下所示:

Track.objects.filter(Q(genre__genre__in=['Rock', 'Pop']) | Q(genre__parent__genre__in=['Rock', 'Pop'])).distinct()
更新

啊,那就有点复杂了,但还是可行的

has_rock_genres = Q(genre__genre='Rock') | Q(genre__parent__genre='Rock')
has_pop_genres = Q(genre__genre='Pop') | Q(genre__parent__genre='Pop')

Track.objects.filter(has_rock_genres & has_pop_genres).distinct()
您可以在一行中完成这一切,但此时代码变得有点混乱

更新

你今天真的在锻炼我的精神,是吗

您需要执行以下操作:

query = None
for genre in genres:
    if query is None:
        query = Q(genre__genre=genre) | Q(genre__parent__genre=genre)
    else:
        query = query & (Q(genre__genre=genre) | Q(genre__parent__genre=genre))

    Track.objects.filter(query).distinct()

如果我理解正确的话,你希望所有的曲目都有一种“摇滚”风格或一种以“摇滚”为母的风格。如果是:

from django.db.models import Q

Track.objects.filter(Q(genre__genre='Rock') | Q(genre__parent__genre='Rock')).distinct()
编辑

事实上,在重读这个问题之后,你似乎想要我说的话,但是要同时列出一个流派列表,而不是一次只列出一个。为此,只需调整上述代码,如下所示:

Track.objects.filter(Q(genre__genre__in=['Rock', 'Pop']) | Q(genre__parent__genre__in=['Rock', 'Pop'])).distinct()
更新

啊,那就有点复杂了,但还是可行的

has_rock_genres = Q(genre__genre='Rock') | Q(genre__parent__genre='Rock')
has_pop_genres = Q(genre__genre='Pop') | Q(genre__parent__genre='Pop')

Track.objects.filter(has_rock_genres & has_pop_genres).distinct()
您可以在一行中完成这一切,但此时代码变得有点混乱

更新

你今天真的在锻炼我的精神,是吗

您需要执行以下操作:

query = None
for genre in genres:
    if query is None:
        query = Q(genre__genre=genre) | Q(genre__parent__genre=genre)
    else:
        query = query & (Q(genre__genre=genre) | Q(genre__parent__genre=genre))

    Track.objects.filter(query).distinct()

不,我想要所有有摇滚或其儿童类型和流行或儿童类型的曲目?希望你能理解我的问题
genre\uuu genre\uu in=['Rock',Pop']
将获得所有曲目,包括摇滚乐或流行乐,但我想要和关系我想要和你上次编辑的一模一样,但我有父流派列表。我怎样才能做到这一点呢?已经工作了11个小时了,我已经疯了,你让我的工作变得轻松了,非常感谢:)@Chris Pratt很好的解决方案,但有一个小故障。使用
query&Q(genre\uu genre=genre)
不会将字段与表中的其他行进行比较,而是将同一行与自身进行比较,结果将为空。你应该使用
q=q.filter(q(genre\uu genre=genre))
insteadNo,我想要所有有摇滚或其子类型和流行或子类型的曲目?希望你能理解我的问题
genre\uuu genre\uu in=['Rock',Pop']
将获得所有曲目,包括摇滚乐或流行乐,但我想要和关系我想要和你上次编辑的一模一样,但我有父流派列表。我怎样才能做到这一点呢?已经工作了11个小时了,我已经疯了,你让我的工作变得轻松了,非常感谢:)@Chris Pratt很好的解决方案,但有一个小故障。使用
query&Q(genre\uu genre=genre)
不会将字段与表中的其他行进行比较,而是将同一行与自身进行比较,结果将为空。您应该使用
q=q.filter(q(genre\uu genre=genre))