我正在开发一个允许用户自己创建和管理用户组的应用程序。
问题是我想存储哪个用户向任何组添加了新成员。
这些是我目前的模型:
class UserManagedGroup(Group):
leader = models.ForeignKey(User, verbose_name=_('group leader'), related_name='leaded_groups')
members = models.ManyToManyField(User, verbose_name=_('members'), through='Membership',
related_name='managed_groups')
class Membership(models.Model):
user = models.ForeignKey(User, related_name='memberships')
group = models.ForeignKey(UserManagedGroup, related_name='memberships')
info = models.OneToOneField('MembershipInfo', verbose_name=_('membership information'))
class Meta:
unique_together = ['user', 'group']
class MembershipInfo(models.Model):
date_added = models.DateField(_('date added'), auto_now_add=True)
made_member_by = models.ForeignKey(User, verbose_name=_('user who made him a member'))
membership_justification = models.TextField(_('membership justification'), blank=True, default='')
@receiver(signals.post_delete, sender=Membership)
def delete_membership_info(sender, instance, *args, **kwargs):
if instance.info.pk:
instance.info.delete()
如您所见,我有一个愚蠢的模型,由于其字段的性质,它MembershipInfo
更适合合并。Membership
此外,MembershipInfo
s 的生命与其绑定Membership
(这就是我必须创建这个 post_delete 信号连接的原因)。
因为这个,我不能合并它们:
您的中间模型必须包含一个 - 并且只有一个 - 目标模型的外键(在我们的示例中为 Person)。如果您有多个外键,则会引发验证错误。
(在我的情况下,我不能对用户使用 2 个外键)
现在,这确实有效,但是我不喜欢它。它使Membership
实例创建变得乏味,因为我必须始终先创建一个MembershipInfo
实例。此外,2 个查询而不是 1 个。
问题将 2 个外键存储到User
绑定到我的成员关系的同一模型 ( ) 的最佳方式。