Bayon Sharke
Bayon Sharke

Reputation: 71

Django Model Overriding save method

This is my models:

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)

I am trying to achive when a new mess created, the members field should be filled with admin.

You may notice, the members field is ManyManyToManyField, I want whenver a new mess is creatd, the admin of the mess also will be a members of Mess by default

I know i can achieve it with signals but i dont want with it. i wnat to achive it overriding save method.

I want members default value will be admin.

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

But it not works!!!!

can anyone help to achive this?

Upvotes: 2

Views: 241

Answers (1)

Elgin Cahangirov
Elgin Cahangirov

Reputation: 2022

Change your save method as below:

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)

Test:

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>]>

Upvotes: 2

Related Questions