Reputation: 71
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
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