class Table(Bean):
number = models.IntegerField(unique=True)
capacity = models.IntegerField()
available = models.BooleanField(default=True)
class Reservation(Bean):
STATUS_CHOICES = [
("confirmed", "Confirmed"),
("cancelled", "Cancelled"),
("finished", "Finished")
]
customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
table = models.ForeignKey(Table, on_delete=models.CASCADE, default=None)
reservation_date = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=50, choices=STATUS_CHOICES, default="confirmed")
def save(
self,
*args,
force_insert=False,
force_update=False,
using=None,
update_fields=None,
):
if self.status == "confirmed" and self.table.available:
self.table.available = False
elif self.status == "cancelled" or self.status == "finished":
self.table.available = False
else:
raise ValidationError(f"Table {self.table.number} with id {self.table.id} is already reserved")
self.table.save()
super().save()
def delete(self, using=None, keep_parents=False):
if not self.table.available:
self.table.available = True
self.table.save()
super().delete()
这些是我的序列化:
class TableSerializer(serializers.ModelSerializer):
class Meta:
model = Table
fields = "__all__"
class ReservationSerializer(serializers.ModelSerializer):
class Meta:
model = Reservation
fields = "__all__"
我应该在哪里添加验证字段?什么是最好的场所 - 模型或连续化器?
,如果验证应遵循,则将其放在模型中。这样,
ModelForm
ModelSerializer
,ModelAdmin
等都将相应地验证数据。但并非所有验证始终存在。例如,如果您进行预订,则可以指定一个人只能保留到表格的一部分(例如非主要表),只有员工才能将人升级到高级表。
因此,某些验证是取决于观点的,然后您在相应的序列化器,
ModelForm
(s)等中定义了该验证。