Изменение булевых данных при добавлении новой регистрации

В этом коде я хочу изменить булевы данные комнаты при добавлении новой регистрации Например: когда я добавляю новую регистрацию в 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 для обновления объекта.

Вернуться на верх