Изменение булевых данных при добавлении новой регистрации
В этом коде я хочу изменить булевы данные комнаты при добавлении новой регистрации Например: когда я добавляю новую регистрацию в django admin булевы данные комнаты меняются на False
пожалуйста, не могли бы вы помочь в этом
from django.db import models
from django.contrib.auth.models import User
class Rooms(models.Model):
room_num = models.IntegerField()
room_bool = models.BooleanField(default=True)
category = models.CharField(max_length=150)
def __str__(self):
return f'{self.room_num}'
class Meta:
verbose_name = 'Room'
class Registration(models.Model):
rooms = models.ForeignKey(Rooms, on_delete=models.CASCADE)
first_name = models.CharField(max_length=150)
last_name = models.CharField(max_length=150)
admin = models.ForeignKey(User, on_delete=models.CASCADE)
pasport_serial_num = models.CharField(max_length=100)
birth_date = models.DateField()
img = models.FileField()
visit_date = models.DateTimeField()
leave_date = models.DateTimeField()
guest_count = models.IntegerField()
def func(self):
room = Rooms.objects.filter(room_bool=True)
for i in room:
if i.room_num == int(self.rooms):
i.room_bool = False #this should change when adding new registration
i.save()
Для этого вам следует использовать сигналы Django. Просто создайте signals.py
в папке вашего приложения и сделайте так:
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Registration
@receiver(post_save, sender=Registration)
def create_profile(sender, instance, created, **kwargs):
if created:
instance.rooms.room_bool = False
instance.rooms.save()
и добавьте в ваш apps.py
файл в том же приложении:
from django.apps import AppConfig
class YourAppConfig(AppConfig):
name = 'your_app'
def ready(self):
import your_app.signals
Этот сигнал изменит соответствующее Registration
связанное Rooms
значение объекта room_bool
на False
, когда оно было сохранено при создании.
PS всегда называйте свою модель в единственном числе. Посмотрите, как ужасно выглядит Rooms
, когда вы действительно говорите об одноместном номере ;)
вы можете переопределить метод save класса Registration, чтобы он вызывался каждый раз, когда объект Registration был создан или обновлен.
class Registration(models.Model):
...
def save(self, *args, **kwargs):
if not self.pk:
self.rooms.room_bool = False
self.rooms.save()
return super().save(*args,**kwargs)
условие if служит для проверки создания или обновления.
if self.pk
для создания и else для обновления объекта.