满足特定条件的Django manytomy查询

2024-04-26 19:04:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这两种型号

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或….)

^{pr2}$

这里G1parent是Pop,G2parent是Rock,我怎么能得到这个?寻找一个优雅的解决方案。在

谢谢!在


Tags: falsetrue类型modelslengthmaxclasscharfield
1条回答
网友
1楼 · 发布于 2024-04-26 19:04:08

如果我能正确理解你的意思,你希望所有的曲目要么是“摇滚”的流派,要么是“摇滚”作为父类的曲目。如果是:

from django.db.models import Q

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

编辑

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

^{pr2}$

更新

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

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

相关问题 更多 >