【发布时间】:2015-03-19 15:18:33
【问题描述】:
总的来说,我对 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)
现在我需要验证 expirydate 是否总是大于 createdon 日期。
我知道我可以在视图中执行此操作,我想这不是一个好主意,因为现在验证只存在于视图中。
所以剩下的就是序列化器和模型了。
我知道我可以重写 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 时,谁能指导我如何处理这种情况?
到目前为止,我已经阅读了一些关于验证的内容:
- 串行器验证
- 字段级验证
- 验证器
- 模型验证
- 覆盖
clean方法 - 覆盖
save方法
- 覆盖
- 只需在视图中手动完成
似乎有很多选择,我什至可能留下了一些,我无法清楚地知道何时使用 where。 如果这有点初级,我很抱歉,但我是框架的新手,django 似乎与我在 PHP 中所做的非常不同。欢迎任何建议!
编辑:我将仅将 django 用于 rest_framework 而没有其他用途,因为我们只想构建 RESTful API。
【问题讨论】:
标签: django datetime python-3.x django-rest-framework