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

时间:2017-03-04 20:30:42

标签: python django

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

Person
  name

Group
  name

PersonGroup
  id
  person_id
  group_id

InvitedPersonGroup
  person_group_id
  invited_reason

Person和Group通过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

1 个答案:

答案 0 :(得分:1)

对于您的使用案例,可以将invited_reasonnull保持一致,以保持模型简单。

对于非常复杂的实际情况,请记住,即使没有'通过'也可以手动创建多对多关系而无需使用" ManyToManyField"字段,包含实体之间的许多类型的关系:

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
        )

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