首页 > 解决方案 > 当我创建 django.models 时,如何通过 room_id 进入选项 = max_guest?

问题描述

我有这样的模型:

class KeyTransfer(Model):
    key_out_data = DateTimeField(null=True, blank=True)
    key_in_data = DateTimeField(null=True, blank=True)
    room_id = ForeignKey(Room, blank=True, null=True, on_delete=CASCADE)
    guests = IntegerField(choices=[(x, str(x)) for x in range(Room.objects.get(number=room_id).max_guests)], blank=True, null=True)
    notes = CharField(max_length=256, blank=True)
    person_id = ForeignKey(Person, null=True, blank=True, on_delete=SET_NULL)

而且我知道我无法使用参数“choices =”在“guests”列中保存一些值,如上所示。结果我得到了错误:

...django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. ...

我明白这个错误意味着什么。

问题是:我是否可以在不使用 django.forms 的“客人”中实现“选择”的一些类似条件?

标签: pythondjangodatabasedjango-modelsdjango-forms

解决方案


似乎您想根据其相关模型的字段设置模型guests字段的上限。您可以通过覆盖方法来做到这一点,并在那里检查分配是否高于. 请参阅以下此方法的实现:KeyTransferroommax_guestssaveguestsmax_guests

from django.db import models
from django.core.exceptions import ValidationError

class Person(models.Model):
    name = models.CharField(max_length=32)

    def __str__(self):
        return "<Person {}>".format(self.name)


class Room(models.Model):
    max_guests = models.IntegerField()


class KeyTransfer(models.Model):
    key_out_data = models.DateTimeField(null=True, blank=True)
    key_in_data = models.DateTimeField(null=True, blank=True)
    room_id = models.ForeignKey('Room', blank=True, null=True, on_delete=models.CASCADE)
    guests = models.IntegerField(blank=True, null=True)
    notes = models.CharField(max_length=256, blank=True)
    person_id = models.ForeignKey('Person', null=True, blank=True, on_delete=models.SET_NULL)

    def save(self, *args, **kwargs):
        room = self.room_id
        if self.guests > room.max_guests:
            raise ValidationError("Assigned guests exceeding related room's maximum limit of {}"\
                                  .format(room.max_guests))
        super().save(*args, **kwargs)

推荐阅读