我有一个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正常工作的原因:
但是,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)]
然而,这并不优雅。在
(django1.3-我没有尝试trunk,但是从阅读代码来看,它的行为与python2.7相同)。
您可以始终直接对数据库设置自己的查询。我相信queryset确实认为指标是一样的。我不确定朋友和敌人是如何相互作用的,但也许你可以只查询特定的id。在
看看django/db/models/fields/相关.py,似乎相关的_name='+'选项是使用中的最后一个字符串片段进行测试的很多人都藏起来了(). 因此,只要在任何字符串上附加一个“+”就可以做到这一点,它允许您在单个模型中拥有唯一的名称,并且仍然忽略了向后的关系。在
相关问题 更多 >
编程相关推荐