【问题标题】:Backwards many-to-many relationship with Proxy models in Django与 Django 中的代理模型反向多对多关系
【发布时间】:2013-06-12 15:01:27
【问题描述】:

我有一个模型名称“组”,它与 Django 用户具有多对多关系,并且在两者之间有一个“成员”表。

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 表的外键。

提前致谢。

编辑:

这里显然有问题:

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

【问题讨论】:

  • 我暂时发现这个丑陋的丑陋解决方案将原始sql添加到组模型: def get_users(self): return User.objects.raw('SELECT * FROM '+User._meta.db_table+'加入 '+Membership._meta.db_table+' ON '+Membership._meta.db_table+'.user_id = '+User._meta.db_table+'.id WHERE '+Membership._meta.db_table+'.group_id = '+str(self.id ))

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


【解决方案1】:

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

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

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

【讨论】:

  • 我仍然无法获取组的用户。如果我无法为用户获取组,我认为您的解决方案将适用,但这不是问题。
  • 你确定你做对了吗?将您的外键更改为 DjangoUser 而不是您的代理用户类。
  • 我试过了。它所做的唯一一件事是我无法从组、用户或 djangouser 获得 m2m 关系。它说:AttributeError:'ManyToManyField'对象没有属性'_m2m_reverse_name_cache'。
  • 问题是关于有一个 ManyToMany 字段 to 代理模型,而引用的 Django 错误票是关于有一个 ManyToMany 字段 on 代理模型。两种完全不同的东西。
猜你喜欢
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 2019-05-09
  • 2019-05-18
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多