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))