python - Django 多对多关系,并通过

标签 python django foreign-keys many-to-many

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

groups.group: Intermediary model Group_to_Member has more than one foreign key to User, which is ambiguous and is not permitted.

那么我该如何正确地做到这一点呢?也许是一般关系?可能有效,但似乎有点令人费解......这是我处理它的方式(删除了不相关的位)

from django.contrib.auth.models import User

class UserGroup(models.Model):
    members = models.ManyToManyField(User, through='Group_to_Member')

class UserGroup_to_Member(models.Model):
    group = models.ForeignKey(UserGroup)
    member = models.ForeignKey(User)

    invited_by = models.ForeignKey(User, related_name="group_invited_users")

解决方案

好的,所以我结合了你们提供的答案(谢谢!)和我在互联网上找到的东西加上我自己公认的微不足道的 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_set.all()

此外,我不会使用“Group”作为您的模型名称,因为 Django 已经有一个 Group 对象。

关于python - Django 多对多关系,并通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307548/

相关文章:

mysql - 只有 2 个外键的表有什么作用?

postgresql - 在 ember 中与数组 id 有很多关系

python - 如何从sqlalchemy中的日期字段获取月份和年份?

python - Jupyter 笔记本 : How to change spacing between Text objects inside HBox?

python - 我可以在未安装 python 的 Windows 7 计算机上在 Sublime Text 2 中运行 Python 吗?

python - 添加批量归一化后训练预训练模型 keras_vggface 会产生非常高的损失

javascript - 验证依赖于数据库中的值的单选按钮

python - eclipse中使用django环境的shell,pydev给出语法错误

采用 json 对象的 Python 函数返回 mongodb 查询对象

Mysql 几列用于多态关系 - 可行吗?