Python Django多对多关系,通过
我想存储哪个用户邀请另一个用户加入组。。。但django告诉我这是模棱两可的,违反了规则(这是有道理的) groups.group:中介模型 组\u到\u成员有多个 用户的外键,即 模棱两可,是不允许的 那么我如何正确地做到这一点呢?也许是一种普通关系?可能有用,但似乎有点复杂。。。下面是我如何处理它(删除了不相关的部分) 解决方案 <> >好,所以我把你们提供的答案(谢谢)和我在互联网+我自己公认的微不足道的Python Fu:Python Django多对多关系,通过,python,django,foreign-keys,many-to-many,Python,Django,Foreign Keys,Many To Many,我想存储哪个用户邀请另一个用户加入组。。。但django告诉我这是模棱两可的,违反了规则(这是有道理的) groups.group:中介模型 组\u到\u成员有多个 用户的外键,即 模棱两可,是不允许的 那么我如何正确地做到这一点呢?也许是一种普通关系?可能有用,但似乎有点复杂。。。下面是我如何处理它(删除了不相关的部分) 解决方案 >好,所以我把你们提供的答案(谢谢)和我在互联网+我自己公认的微不足道的Python Fu: from django.contrib.auth.models im
from django.contrib.auth.models import User
class UserGroup(models.Model):
# notice there is no member object here
... other model data
def add_member(self, **kwargs):
g2m = UserGroup_to_Member(group = self, **kwargs)
g2m.save()
def remove_member(self, member):
g2m = UserGroup_to_Member.objects.get(group=self, member=member)
g2m.delete()
# This is not elegant at all, help please? I'm pretty sure it isn't
# as bad on the database as it looks though.
def get_members(self):
g2ms = UserGroup_to_Member.objects.filter(group=self)
member_ids = [g2m.member.id for g2m in g2ms]
members = User.objects.none()
for id in member_ids:
members = members | User.objects.get(id=id)
return members
class UserGroup_to_Member(models.Model):
group = models.ForeignKey(UserGroup)
member = models.ForeignKey(User)
invited_by = models.ForeignKey(User, related_name="group_invited_users")
您必须自己管理它:
class MyGroup(models.Model):
name = models.CharField(max_length=100)
class Membership(models.Model):
group = models.ForeignKey(MyGroup)
member = models.ForeignKey(User)
invited_by = models.ForeignKey(User, related_name='invited_set')
然后,您不必使用group.members.all()
而是使用group.membership\u set.all()
另外,我不会使用“Group”作为您的模型名,因为Django已经有了一个Group对象。如果您使用的是Django 1.7,这是可能的 从文档中: 在Django 1.6及更早版本中,中间模型包含 多对多模型中涉及的任何模型的一个外键 关系过去是被禁止的
之前的答案是:@seth,这不是添加相关的_名称的问题,问题是用户有两个外键关系,不管我如何称呼它们,或者如果我设置了相关的_名称,另一个与您有完全相同的问题(即同一个表上有两个外键),所以我认为这会有所帮助。我的django-fu有点生涩,所以也许我误解了你的问题。你有数据库设置吗?为什么不在它上面运行inspectdb,看看它生成了什么模型?从文档(从另一个问题的最后一个答案)可以看出,您想要做的事情是不可能开箱即用的。谢谢你的帮助,我得到了一个拼凑在一起的解决方案谢谢关于型号名称的提示,但是你的解决方案没有使用多对多关系,所以。。。group.members.all()返回用户对象的查询集,而group.membership\u set.all()返回成员对象的查询集使用该方法获取组成员列表的唯一方法是member\u list=[m.member for m in membership.objects.filter(group=group)]您搞错了。您正在寻找用户,因此必须查看用户模型(或自定义管理器)。因此,您应该使用`members=User.objects.filter(
class MyGroup(models.Model):
name = models.CharField(max_length=100)
class Membership(models.Model):
group = models.ForeignKey(MyGroup)
member = models.ForeignKey(User)
invited_by = models.ForeignKey(User, related_name='invited_set')