【问题标题】:Django many-to-many relations, and throughDjango 多对多关系,并通过
【发布时间】:2009-08-20 17:01:55
【问题描述】:

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

groups.group:中间模型 Group_to_Member 有多个 用户的外键,即 模棱两可,是不允许的。

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

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")

【问题讨论】:

  • 以前有这个答案:stackoverflow.com/questions/583327/…
  • @seth,这不是添加相关名称的问题,问题是与用户有 2 个外键关系,不管我叫它们什么,或者我是否设置了相关名称
  • 另一个和你有完全相同的问题(即同一张桌子上有两个外键)所以我认为它会有所帮助。我的 django-fu 有点生硬,所以也许我误解了你的问题。你有设置数据库吗?为什么不直接在其上运行 inspectdb 并查看它生成的模型? docs.djangoproject.com/en/dev/ref/django-admin
  • 从文档(来自其他问题的最后一个答案)看来,您想要做的事情不可能开箱即用。 docs.djangoproject.com/en/dev/topics/db/models/…
  • 感谢您的帮助,我找到了一个解决方案

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


【解决方案1】:

你必须自己管理:

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.membership_set.all()代替group.members.all()

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

【讨论】:

  • 感谢关于模型名称的提示,但您的解决方案不使用多对多关系
  • also... group.members.all() 返回 User 对象的查询集,而 group.membership_set.all() 返回 Membership 对象的查询集
  • 使用该方法获取组成员列表的唯一方法是 member_list = [m.member for m in Membership.objects.filter(group=group)]
  • 你错了。您正在寻找用户,因此您必须通过用户模型(或自定义管理器)。因此,您应该使用 `members = User.objects.filter(
【解决方案2】:

如果您使用的是 Django 1.7,这是可能的。

来自文档:https://docs.djangoproject.com/en/1.7/topics/db/models/#extra-fields-on-many-to-many-relationships

在 Django 1.6 及更早版本中,中间模型包含超过 多对多中涉及的任何模型的一个外键 曾经被禁止的关系。

【讨论】:

    猜你喜欢
    • 2016-04-18
    • 2015-02-15
    • 1970-01-01
    • 2011-10-09
    • 2015-12-29
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多