Django填充ManyToManyField覆盖保存方法

时间:2019-09-28 13:49:58

标签: django django-models

当我创建一个Mess时,它也需要填写admin字段,并且我总是这样做。

我希望在创建混乱时,混乱的members字段应自动填充admin

您在这里担任我的管理员:

class Mess(models.Model):
    alias = models.UUIDField(
        primary_key=True,
        default=uuid4,
        editable=False
    )
    name = models.CharField(max_length=50, null=False, blank=False)
    address = models.CharField(max_length=300)
    admin = models.OneToOneField(
        Person,
        on_delete=models.CASCADE,
        related_name='mess_admin'
    )
    members = models.ManyToManyField(
        Person,
        related_name='mess_members',
        blank=True,
    )

    def save(self, *args, **kwargs):
        if self.admin not in self.members_set.all():
            self.members.add(self.admin)
        super(Mess, self).save(*args, **kwargs)

我想覆盖保存方法,我也想将管理员添加到members字段中,但我不想手动填充它,它会添加混乱的admin,并且同一管理员将在{{ 1}}字段。

有人可以帮助我实现这一目标吗?我当前的members方法无法满足我的要求。

这是它引发的错误:

save

2 个答案:

答案 0 :(得分:1)

在模型中,您将字段定义为members,而不是members_set

class Mess(models.Model):
    ...
    members = models.ManyToManyField(...)
    ...

我还建议使用.filter().exists()而非not in来测试成员资格:

def save(self, *args, **kwargs):
    if not self.members.filter(pk=self.admin.pk).exists():
    ...

您是否尝试过先保存然后添加到members?在这种情况下,对super()的呼叫首先出现:

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)

    if not self.members.filter(pk=self.admin.pk).exists():
        self.members.add(self.admin)

答案 1 :(得分:1)

class Mess(models.Model):
    ...
    admin = models.OneToOneField(
        Person,
        on_delete=models.CASCADE,
        related_name='mess_admin'
    )
    members = models.ManyToManyField(
        Person,
        related_name='mess_members',
        blank=True,
    )

    def save(self, *args, **kwargs):
        super(Mess, self).save(*args, **kwargs)
        if self.members.filter(pk=self.admin.id).count() == 0:
            self.members.add(self.admin)

应该可以解决问题。

说明: 1)如@Ralf所述,您拥有属性members而不是members_set。 2)首先保存,然后查看您的模型是否仍需要更新