Модели Django для приложений для социальных сетей ValueError в ManyToManyField - PullRequest
2 голосов
/ 01 октября 2019

Я создаю приложения для социальных сетей.

Это мои модели:

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метод ..

ValueError в / admin / social / group / add /

"<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.

Может кто-нибудь помочь мне добиться этого?

1 Ответ

0 голосов
/ 01 октября 2019

Он жалуется, что вы не можете перебрать саму instance.admin, только более instance.admin<b>.all()</b>

Вы можете использовать итеративную распаковку здесь, чтобы сделать добавление людей более удобным. Обратите внимание, что вы не должны instance.save(), если вы изменяете отношение «многие ко многим», поскольку оно сохраняется в «скрытой» модели между двумя моделями.

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

При этом, если вы используете ModelForm, он все равно не будет работать. Действительно, поскольку модельная форма сначала сохранит группу, а затем добавит участников. Таким образом, post_save будет уже запущен до , когда вы добавляете членов администратора.

Так что я думаю, что если вы не добавили значения в функцию save(..) и использовали ModelForm, вы должны выполнить логику в представлении . Таким образом, вы можете определить это как:

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())
    # &hellip;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...