当我创建一个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
答案 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)首先保存,然后查看您的模型是否仍需要更新