2

我正在构建一个社交媒体应用程序。

这是我的模型:

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同一组的一个,这就是为什么我覆盖保存方法但它抛出了我上面的错误。

我也尝试使用 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字段。

谁能帮我实现这一目标?

4

1 回答 1

0

它抱怨你不能迭代instance.admin自己,只能迭代instance.admin.all()

您可以在此处使用可迭代解包,以使添加人员更加方便。请注意,如果您更改多对多关系,则不必这样做,因为它保存在两个模型之间的“隐藏”模型instance.save()

@receiver(post_save, sender=Group)
def make_admin_also_members(sender, instance, created, **kwargs):
    if created:
        instance.members.add(*instance.admin.all())

话虽如此,如果您使用 a ModelForm,它仍然无法正常工作。确实,既然一个模型表单会先保存组,然后再添加成员。因此,在您添加管理员成员之前post_save,将已经触发。

所以我猜如果你没有在save(..)函数中添加值,而是使用了 a ,你应该在viewModelForm中执行逻辑。因此,您可以将其定义为:

def some_view(request):
    # ...
    if request.method == 'POST':
        form = MyModelFrom(request.POST)
        if form.is_valid():
            instance = form.save()
            instance.members.add(*instance.admin.all())
    # …
于 2019-10-01T08:08:42.903 回答