Django Заполняет перезаписывающий метод сохранения ManyToManyField - PullRequest
1 голос
/ 28 сентября 2019

Когда я создаю 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, но я неЗаполните его вручную, он добавит администратора беспорядка, и тот же администратор тоже будет в поле members.

Может кто-нибудь помочь мне добиться этого?Мой текущий save метод не работает в соответствии с моим требованием.

это ошибки, которые он выдает:

AttributeError at /admin/mess/mess/add/
'Mess' object has no attribute 'members_set'

Ответы [ 2 ]

1 голос
/ 28 сентября 2019
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) Сначала сохраните, а затем посмотрите, нуждается ли ваша модель в обновлении

1 голос
/ 28 сентября 2019

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