使用uu in=[somelist]过滤模型的ManyToMany字段时,当它应该生成s时,将生成零结果

2024-04-19 17:55:11 发布

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

我还没有在网上找到解决办法--我不是第一个尝试这个的人。你知道吗

以下是我的模型结构:

class TopModel(models.Model):
    type = models.CharField()

class MiddleModel(models.Model):
    parent = models.ForeignKey(TopModel)

class LowerModel(model.Model):
    middleParent = models.ForeignKey(MiddleModel)
    topParent = models.ForeignKey(TopModel, related_name="ref_to_top_parent")
    topmodel_refs = models.ManyToMany(TopModel, related_name="ref_to_other_tops")

我需要通过一些奇怪的查询来过滤。我使用MiddleModel对顶级模型进行两次过滤——您将看到。你知道吗

所以我做了两个查询集:

currentMidMod = MiddleModel.objects.get(pk=1)
firstQuerySet = currentMidMod.topmodel_set.all()

secondMidMod = MiddleModel.objects.get(pk=2)
secondQuerySet = secondMidMod.topmodel_set.all()

然后我过滤第一个:

firstQuerySet = firstQuerySet.filter(type__contains="somevalue")

然后我过滤第二个:

secondQuerySet = secondQuerySet.filter(type__contains="test") #produces a count() of 10
#Grab a valueset of the pks
compareList = list(secondQuerySet.values_list('pk', flat=True))

那么问题就出现在这里:

newQuerySet = firstQuerySet.filter(ref_to_top_parent__topmodel_refs__in=compareList)

newQuerySet.count() #equals 0 when I know it should equal 5

因此,我试图通过将我的第一个查询集与我创建的值列表中的一个pk值列表进行比较,来过滤我的第一个查询集,通过它的所有低模型反向foreignkeys,通过那些低模型许多键列表返回TopModels

它从来没有找到匹配的'pks',即使我可以手动通过phpAdmin查找匹配自己

我要死了。请帮帮我!你知道吗

编辑:当试图查询一个PK而不是一个列表时,它可以正常工作

newQuerySet = firstQuerySet.filter(ref_to_top_parent__topmodel_refs__pk=74956)

当试图将这个ManyToMany字段与一个list()值(包括'74956')进行比较时,它找不到任何匹配项——它至少应该在我想象的值列表中找到'74956'。你知道吗


Tags: to模型ref列表modelmodelsfilterclass