Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django多对多关系,通过_Python_Django_Foreign Keys_Many To Many - Fatal编程技术网

Python Django多对多关系,通过

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

我想存储哪个用户邀请另一个用户加入组。。。但django告诉我这是模棱两可的,违反了规则(这是有道理的)

groups.group:中介模型 组\u到\u成员有多个 用户的外键,即 模棱两可,是不允许的

那么我如何正确地做到这一点呢?也许是一种普通关系?可能有用,但似乎有点复杂。。。下面是我如何处理它(删除了不相关的部分)

解决方案 <> >好,所以我把你们提供的答案(谢谢)和我在互联网+我自己公认的微不足道的Python Fu:
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')