使用__in = [somelist]过滤模型的ManyToMany字段,当它产生多个

时间:2017-07-20 18:56:51

标签: python django many-to-many django-queryset

我还没有在网上找到解决方案 - 我无法成为第一个尝试此问题的人。

这是我的模型结构:

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过滤Top Model两次 - 你会看到。

所以我制作了2个查询集:

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

所以我试图通过所有LowerModel反向外键将我的第一个查询集过滤掉那些通过将它与我创建的值列表中的pk值列表进行比较的返回TopModels的ManyToMany键列表

它永远找不到匹配的' pks'即使我可以手动浏览phpAdmin并自己找到匹配

我快死了。请帮忙!

编辑:当试图查询单个PK而不是列表时 - 它工作得很好,例如。

newQuerySet = firstQuerySet.filter(ref_to_top_parent__topmodel_refs__pk=74956)

当尝试将ManyToMany字段与值列表()(包括' 74956')进行比较时,它找不到任何匹配项 - 它至少应该找到' 74956'在我想象的values_list中。

1 个答案:

答案 0 :(得分:1)

正如对原始问题的评论中所讨论的那样,没有在ManyToMany关系的中间表中创建条目。我只想要上网点! :)