gpt4 book ai didi

django - 使用 auto_now 对字段进行模型日期时间字段验证

转载 作者:行者123 更新时间:2023-12-03 00:01:38 26 4
gpt4 key购买 nike

总的来说,我对 django 和 python 非常陌生,我正在尝试学习rest_framework 来创建 RESTful API。

所以我有一个这样的模型:

class Listing(models.Model):
listingid = models.BigIntegerField(primary_key=True)
sellerid = models.IntegerField()
createdon = models.DateTimeField(auto_now_add=True, editable=False)
expirydate = models.DateTimeField(null=True)
validationstatus = models.SmallIntegerField(default=0)
listingstatus = models.SmallIntegerField(
choices=((0, 'Active'),
(1, 'Hidden'),
(2, 'Suspended'),
(4, 'Expired'),
(5, 'Deleted'),
),
default=0)

现在我需要验证到期日期始终大于创建日期。

我知道我可以在 View 中执行此操作,我想这不是一个好主意,因为现在验证仅存在于 View 中。
这样我就只剩下序列化器和模型了。

我知道我可以重写 save 方法来进行检查,如下所示:

class MasterListing(models.Model):
# fields here..

def save(self, *args, **kwargs):
if self.expirydate > self.createdon:
super().save(*args, **kwargs)
return ValidationError("Expiry date cannot be greater than created date ("++")")

但我不知道这是否是一个好主意,因为现在我提出了一个程序员可能会忘记捕获的错误。我也不确定当此方法运行时是否会填充字段。
我在文档中读到的另一种方法是 clean 方法,我不太理解它。

当您使用rest_framework时,任何人都可以指导我如何处理类似的情况吗?
到目前为止我读到的一些关于验证的内容:

  1. 序列化器验证
    • 字段级验证
    • 验证器
  2. 模型验证
    • 覆盖clean方法
    • 覆盖保存方法
  3. 只需在 View 中手动执行即可

似乎有很多选项,我什至可能留下了一些,我无法清楚地知道什么时候用在哪里。如果这有点初级,我很抱歉,但我是框架新手,django 似乎与我在 PHP 中所做的非常不同。欢迎任何建议!

编辑:我将仅将 django 用于rest_framework,而不使用其他任何东西,因为我们只想构建 RESTful API。

最佳答案

Django REST 框架用于调用 Model.clean,这是以前推荐的放置 Django 表单和 DRF 序列化器中需要使用的验证逻辑的位置。 从 DRF 3.0 开始,this is no longer the case Model.clean 将不再被称为 during the validation cycle 。经过这一更改,现在有两个可能的位置可以放置适用于多个字段的自定义验证逻辑。

如果您仅使用 Django REST 框架进行验证,并且没有任何其他需要手动验证数据的区域(例如 ModelForm,或者在 Django 管理中),那么你应该查看 Django REST framework's validation framework .

class MySerializer(serializers.ModelSerializer):
# ...

def validate(self, data):
# The keys can be missing in partial updates
if "expirydate" in data and "createdon" in data:
if data["expirydate"] < data["createdon"]:
raise serializers.ValidationError({
"expirydata": "Expiry date cannot be greater than created date",
})

return super(MySerializer, self).validate(data)

如果您需要将 Django REST 框架与使用模型级验证的 Django 组件结合使用(例如 Django 管理),您有两种选择。

  1. Model.cleanSerializer.validate 中重复您的逻辑,违反 DRY principle并对 future 的问题敞开心扉。
  2. Model.save 中进行验证,并希望以后不会发生任何奇怪的情况。

but I dont know if this would be a good idea, since now I am raising an error which the programmer may forget to catch.

我敢说,故意引发错误比保存的数据可能无效要好。一旦开始允许无效数据,您就必须在使用数据的任何地方进行检查以修复它。如果您不允许它进入无效状态,则不会遇到该问题。

I am also not sure if the fields would be populated when this method would run.

您应该能够假设,如果要保存对象,则字段已经填充了它们的值。

关于django - 使用 auto_now 对字段进行模型日期时间字段验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28061550/

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