添加新注册时更改布尔数据
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
用于创建对象,否则用于更新对象。
在这段代码中,我想在添加新注册时更改房间的布尔数据 例如:当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
用于创建对象,否则用于更新对象。