向后与Django中的代理模型的多对多关系

时间:2013-06-16 14:25:15

标签: python django orm many-to-many django-users

我有一个模型名称'Group',它与Django用户有一个ManyToMany关系,并且有一个'Membership'表。

class UserManager(models.Manager):get_query_set(self):
        return super(UserManager, self).get_query_set().select_related('expenses')

class User(DjangoUser):
    objects = UserManager()
    class Meta:
        proxy = True

class Group(models.Model):
    name = models.CharField(verbose_name=_('Name'), max_length=255)
    users = models.ManyToManyField(User, related_name='groups', through='Membership')

class Membership(models.Model):
    user = models.ForeignKey(User)
    group = models.ForeignKey(Group)
    date_joined = models.DateField(auto_now_add=True, verbose_name=_('Date joined'))

当我尝试为用户获取组时,一切都很好:

>>> User.objects.get(id=2).groups.all()    
[<Group: Group object>]
>>> User.objects.get(id=2).groups.get(id=1)
<Group: Group object>

问题在于我无法获得群组的用户:

>>> Group.objects.get(id=1).users.all()    
[]

我注意到的一件事是我的数据库中的字段'user_id'(由django生成)没有auth_user表的外键,但'group_id'字段具有myapp_group表的外键。 / p>

提前致谢。

修改

这里显然有问题:

>>> User.objects.get(id=2).groups.get(id=1).users.all()    
[]

1 个答案:

答案 0 :(得分:1)

遗憾的是,这是Django ORM中记录的错误。您可以在此处找到有关它的更多信息:

https://code.djangoproject.com/ticket/17299

最好的选择是简单地指向默认模型。由于两者都保存到数据库中的相同位置,因此可以使用the following technique将返回的模型从auth.models.User“转换”为代理用户模型。确保使用第二次没有访问数据库的那个。