Django manytomany在某些情况下具有额外字段

2024-10-02 00:22:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我的数据库结构如下所示:

Person
  name

Group
  name

PersonGroup
  id
  person_id
  group_id

InvitedPersonGroup
  person_group_id
  invited_reason

通过PersonGroup,个人和组之间存在多对多关系,但有时由于这些人收到邀请,这种关系将是唯一的,并且这种关系应该通过InvitedPersonGroup

如何动态地使用through

    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(Person, 
through='PersonGroup or InvitedPersonGroup')

        def __unicode__(self):
            return self.name

Tags: nameselfid数据库关系modelsgroup结构
1条回答
网友
1楼 · 发布于 2024-10-02 00:22:13

对于您的用例,可以使用invited_reasonnull来保持模型的简单

对于非常复杂的关系,请记住,多对多关系可以在没有“ManyToManyField”的情况下手动创建,即使没有“through”字段,也可以在实体之间保存多种类型的关系:

class Person(models.Model):
    pass


class Group(models.Model):
    pass


class Membership(models.Model):  # "PersonGroup"
    person = models.ForeignKey(Person, related_name='memberships')
    group = models.ForeignKey(Group, related_name='memberships')

    # other fields...

    class Meta:
        unique_together = (
            ('person', 'group'),  # optional
        )


class Invitation(models.Model):  # "InvitedPersonGroup"
    person = models.ForeignKey(Person, related_name='invitations')
    group = models.ForeignKey(Group, related_name='invitations')

    # other fields...

    class Meta:
        unique_together = (
            ('person', 'group'),  # optional
        )

这意味着任何关系都可以根据需要进行定制

相关问题 更多 >

    热门问题