Метод сохранения модели Django - PullRequest
1 голос
/ 28 сентября 2019

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

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, *arg, **kwargs):
        print(kwargs)

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

Вы можете заметить, чтоmembers поле - ManyManyToManyField, я хочу, чтобы при создании нового mess admin из mess также было members из Mess по умолчанию

Я знаю, что могудостичь этого с помощью сигналов, но я не хочу с этим.я хочу достичь этого, переопределяя save метод.

Я хочу, чтобы членами по умолчанию было значение admin.

members = models.ManyToManyField(
        Person,
        related_name='mess_members',
        default=self.admin,
        blank=True,
    )

Но это не работает !!!!

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

1 Ответ

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

Измените свой save метод, как показано ниже:

models.py

from django.db import models
from uuid import uuid4


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

    def __str__(self):
        return "<Person {}>".format(self.name)


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.all():
            self.members.add(self.admin)
        super(Mess, self).save(*args, **kwargs)

Тест:

from testapp.models import Person, Mess

p1 = Person.objects.create(name="person1")

p2 = Person.objects.create(name="person2")

m1 = Mess.objects.create(name="mess1", address="address1", admin=p1)

m1.members.all()  # Person1 was added on save
<QuerySet [<Person: <Person person1>>]>

p1.mess_members.all()
<QuerySet [<Mess: Mess object>]>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...