gpt4 book ai didi

django - 如何在 django 中检查约束来检查相关模型的两个字段?

转载 作者:行者123 更新时间:2023-12-04 07:26:49 25 4
gpt4 key购买 nike

from django.db import models
from djago.db.models import F, Q

class(models.Model):
order_date = models.DateField()

class OrderLine(models.Model):
order = models.ForeignKeyField(Order)
loading_date = models.DateField()

class Meta:

constraints = [
models.CheckConstraint(check=Q(loading_date__gte=F("order__order_date")), name="disallow_backdated_loading")
我想确保订单行 loading_date 总是高于 orderdate

最佳答案

一个 CHECK约束可以跨越一列或一个表,但不能跨越多个表,所以这不可能通过 CHECK约束。
一些数据库允许定义触发器。例如,这些触发器在创建/更新记录时运行,并且可以运行 SQL 查询,并根据此类查询决定拒绝创建/更新,但目前 Django ORM 不支持。
还可以使用 id 的复合主键和订单的创建日期,在这种情况下,创建时间戳因此存储在 OrderLine 中。表,因此可以在表级别实现检查,但是由于多种原因,Django 不支持使用复合主键。
因此,除了运行原始 SQL 之外,例如使用具有 RunSQL operation [Django-doc] 的迁移文件,但这可能是特定于数据库的。
因此可能最明智的检查是覆盖模型 clean() method [Django-doc] .然而 Django 不运行 .clean()在数据库中保存对象之前的方法,这只能由 ModelForm 完成s 和 ModelAdmin s。因此,我们可以添加一个检查:

from django.core.exceptions import ValidationError

class OrderLine(models.Model):
order = models.ForeignKeyField(
Order,
on_delete=models.CASCADE
)
loading_date = models.DateField()

def clean(self):
if self.loading_date < self.order.order_date:
raise ValidationError('Can not load before ordering')
return super().clean()

关于django - 如何在 django 中检查约束来检查相关模型的两个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68168924/

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