多个多个关联名为“+”的多个关系会导致错误的查询

2024-04-26 18:00:54 发布

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

我有一个Django模型,它与auth.User类有两个多对多关系,比如:

class Indicator(models.Model):
    friends = models.ManyToManyField(User, related_name="+")
    enemies = models.ManyToManyField(User, related_name="+")

相关的名称被设置为“+”so that there's no backwards relation,也就是说,如果u是用户,我不需要u.friends_set和{}。在

添加、删除和清除“朋友”和“敌人”都很好-如果我直接在数据库中检查(即不是通过Django),我可以看到我所期望的变化。但是,如果我通过Django获得查询集,那么不管我使用i.friends.all()还是{}(假设i是一个指示符实例),就会得到“敌人”列表。在

如果我检查ManyRelatedManager,就会发现through属性是正确的,这(如果我理解正确的话)就是允许add/remove/clear正常工作的原因:

^{pr2}$

但是,get_query_set方法basically获取超类(用户管理器),并使用kwargsi.friends.core_filters对其调用filter,即{'+__pk': 404L}(如果指示符ID为404)。“朋友”和“敌人”的核心过滤器是相同的,这就解释了为什么我错误地为两者获取相同的查询集。在

我可以解决这个问题(无需设置相关的_名称):而不是i.friends.all()我可以使用:

[friend.user for friend in i.friends.through.objects.filter(indicator__id=i.id)]

然而,这并不优雅。在

  1. 这是Django的“set related_name to'+'”系统的限制吗?(我在任何地方都找不到这个文档)-也就是说,每个不同的对象/对象对只能使用一次'+'?在
  2. 这是一个Django错误吗(例如,对report的东西)?在
  3. 有没有更好的方法来解决这个问题?在

(django1.3-我没有尝试trunk,但是从阅读代码来看,它的行为与python2.7相同)。


Tags: django方法用户name名称models朋友all
2条回答

您可以始终直接对数据库设置自己的查询。我相信queryset确实认为指标是一样的。我不确定朋友和敌人是如何相互作用的,但也许你可以只查询特定的id。在

看看django/db/models/fields/相关.py,似乎相关的_name='+'选项是使用中的最后一个字符串片段进行测试的很多人都藏起来了(). 因此,只要在任何字符串上附加一个“+”就可以做到这一点,它允许您在单个模型中拥有唯一的名称,并且仍然忽略了向后的关系。在

相关问题 更多 >