приложения для социальных сетей django Вопрос о населении ManyToManyField - PullRequest
1 голос
/ 30 сентября 2019

Я пишу приложение для социальных сетей с django. Я спроектировал модель, но когда я пытаюсь ее заполнить, она выдает эту ошибку:

ValueError at /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.

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

from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=20)


class Group(models.Model):
    admin = models.ForeignKey(
        Person, 
        on_delete=models.CASCADE,
        related_name='group_admin'
    )
    members = models.ManyToManyField(
        Person, 
        related_name='group_members',
        blank=True
    )

    def save(self, *args, **kwargs):
        self.members.add(self.admin)
        super(Group, self).save(*args, **kwargs)

Я хочу, чтобы admin такжебыть членом group.

Когда я сохраняю такой метод save, как этот ...

def save(self, *args, **kwargs):
    super(Group, self).save(*args, **kwargs)
    self.members.add(self.admin)

... он не выдает никакой ошибки, но также и поле членовне заполняется должным образом.

Я хочу добиться того, чтобы при отправке администратора при создании Group поле членов автоматически заполнялось тем же внешним ключом администратора.

Я имею в виду, admin будет в members той же группы.

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

1 Ответ

0 голосов
/ 30 сентября 2019

Переписать метод save модели может быть сложно, и зачастую это не лучшее решение для данной задачи.

Другой подход, который вы можете попробовать, - это сигнал post_save (хотя сигналы также оспариваются!).

Это может выглядеть примерно так в ваших models.py :

from django.db.models.signals import post_save
from django.dispatch import receiver


class Group(models.Model):
    admin = ...
    members = ...


@receiver(post_save, sender=Group)
def add_admin_to_members(sender, instance, created, **kwargs):
    """
    adds self.admin to self.members when Group is created
    """

    if created and instance.admin:
        instance.members.add(instance.admin)

Когда вы создаете Group сadmin в других местах, например, так ...

Group.objects.create(admin=SomeUser)

..., функция add_admin_to_members будет выполняться при подключении к сигналу post_save модели Group.

РЕДАКТИРОВАТЬ

Проверьте этот репозиторий для демонстрации того, что описано в ответе. Особенно проверьте контрольный пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...