添加新注册时更改布尔数据

Change boolean data when adding new registration

在这段代码中,我想在添加新注册时更改房间的布尔数据 例如:当l在django admin中添加新注册时 房间的布尔数据应更改为 False

from django.db import models

from django.contrib.auth.models import User

#This class Rooms for adding rooms
class Rooms(models.Model):
    room_num = models.IntegerField()
    room_bool = models.BooleanField(default=True) #if room_bool = True room is open, else closed.
    category = models.CharField(max_length=150)

    def __str__(self):
        return f'{self.room_num}'

    class Meta:
        verbose_name = 'Room'

#This class Registration for visitors, to open room for the them
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 ;)

您可以重写每次创建或更新注册对象时调用的注册 class 的保存方法。

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 用于创建对象,否则用于更新对象。