【发布时间】:2020-01-30 11:49:48
【问题描述】:
我正在构建一个社交媒体应用程序。
这是我的模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=50)
class Group(models.Model):
admin = models.ManyToManyField(Person, related_name='admin')
members = models.ManyToManyField(Person, blank=True, related_name='members')
def save(self, *args, **kwargs):
self.members.add(self.admin)
super(Group, self).save(*args, **kwargs)
当我尝试创建新组时,由于覆盖 save 方法而引发以下错误..
/admin/social/group/add/处的ValueError
"<Group: Group object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.
我想要一个组的admin 也将是同一组的members,这就是为什么我覆盖了 save 方法但它抛出了上面的错误。
我也尝试使用 Django signal 来实现这一点,如下所示
@receiver(post_save, sender=Group)
def make_admin_also_members(sender, instance, created, **kwargs):
if created:
instance.members.add(instance.admin)
instance.save()
它会引发以下错误:
TypeError at /admin/social/group/add/
int() argument must be a string, a bytes-like object or a number, not 'ManyRelatedManager'
然后我尝试像这样实现它:
@receiver(post_save, sender=Group)
def make_admin_also_members(sender, instance, created, **kwargs):
if created:
instance.members.add(str(instance.admin))
instance.save()
它引发了以下错误:
ValueError at /admin/social/group/add/
invalid literal for int() with base 10: 'social.Person.None'
遇到上述错误后,我尝试如下实现此目标
@receiver(post_save, sender=Group)
def make_admin_also_members(sender, instance, created, **kwargs):
if created:
instance.members.add((member.id for member in instance.admin))
instance.save()
我被这个错误弄伤了:
TypeError at /admin/social/group/add/
'ManyRelatedManager' object is not iterable
如果我像下面这样尝试:
@receiver(post_save, sender=Group)
def make_admin_also_members(sender, instance, created, **kwargs):
if created:
instance.members.add(*instance.admin.all())
instance.save()
它不会引发任何错误,但问题是,它没有保存 members 字段。
谁能帮我实现这个目标?
【问题讨论】:
-
您确定
admin应该是ManyToManyField 吗?一个组可以有多个管理员吗? (如果是这样,至少你应该叫它admins。)
标签: django django-models django-rest-framework