gpt4 book ai didi

python - 根据 Django 中引用该模型的外键数量来限制外键数量?

转载 作者:行者123 更新时间:2023-11-30 23:08:11 25 4
gpt4 key购买 nike

我是 Django 新手,所以如果这是一个愚蠢的问题,请原谅我!

所以我有一个名为 Resident 的模型,它定义了出租房间的租户的一些基本特征:

class Resident(models.Model):
fname = models.CharField(max_length=50)
lname = models.CharField(max_length=50)
email = models.EmailField()
room = models.ForeignKey('Room')

我还有一个名为 Room 的模型,它定义了租户租赁的房间的基本特征:

class Room(models.Model):
number = models.IntegerField()
floor = models.IntegerField()
beds = models.IntegerField()

如何根据 Room.beds 定义的房间中的床位数量限制 Resident.room 字段中的外键数量?例如,如果 Room.beds == 2,如何将 Resident 允许的外键数量限制为最多 2 个?

最佳答案

使用pre_save信号,每当您尝试创建新的 Resident 实例时,您可以首先检查该居民将入住的房间中的可用床位总数:

from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.core.exceptions import ValidationError

@receiver(pre_save, sender=Resident)
def resident_pre_save(sender, instance, **kwargs):
if instance.room.beds == instance.room.resident_set.count():
raise ValidationError('No bed left for: {}'.format(instance)

您可以在 models.py 末尾添加上述代码。请参阅documentation有关 Django 中信号如何工作的更多信息。

您可以使用 try/except: 包装 .save() 方法,以优雅地处理验证错误,以防您可能希望将其通过管道传输到记录器中。

def save(self, *args, **kwargs):    
try:
super(Resident, self).save(*args, **kwargs)
except ValidationError, exc:
logger.error('Saving resident failed. Error: {}'.format(exc))

关于python - 根据 Django 中引用该模型的外键数量来限制外键数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com