仅在两个字段都提供给管理员创建unique_together
或通过Form
请求提供了两个API
和create
调用的情况下,才需要检查update
。如果发生这种情况并且字段不是unique_together
,则需要将Exception
传播到django-admin
创建Form
和RestFramework
的{{1}}。 >
这是我的模型的简化示例:
Serializer/ViewSet
如您所见,在模型级别,class MyModel(models.Model):
time = models.TimeField(null=True, blank=True)
date = models.DateField(null=True, blank=True)
some_other_field = models.BooleanField(default=False)
...
和time
都不是必需的,并且可以为空。
另一方面,应用逻辑要求至少提供这些字段中的一个,如果同时提供了这两个字段,则这对整个表应该是唯一的,以避免重复date
组成。
可通过以下节点访问此模型:datetime
和django-admin
的端点,使用DjangoRestFramework
。
从ViewSet
的角度来看,创建新记录似乎不是问题,我可以覆盖API
的{{1}}方法:
validate
但是,当我收到Serializer
或 def validate(self, data):
if not data.get('time') and not data.get('date'):
raise serializers.ValidationError(
"At least one of this fields is required: time, date"
)
if OpenTable.objects.filter(
time=data.get('time'),
date=data.get('date')).exists():
raise serializers.ValidationError('Duplicates for date or datetime not allowed')
return data
请求时,这成为一个问题,因为尽管此记录是表中唯一的记录,但我还是提出了PUT
,因为这是有记录的PATCH
-ValidationError
对。
覆盖date
方法也不能解决阻止从time
创建这样的对的问题。
目前,我最接近验证这一点的方法是使用validate
的{{1}}方法,但是我不明白如何正确处理此情况以符合Django-Admin
/ save
个流程。
答案 0 :(得分:3)
对于Django Rest Framework验证,您可以使用self.instance检查来使用不同的验证流程来创建和修改对象;
def validate(self, data):
if self.instance:
# Modifiying an existing instance, run validations accordingly
else:
# Creading a new instance, run validations accordingly
对于管理站点,您可以使用Django的 ModelForm 结构及其验证来强制执行管理站点的验证。您需要将自己的管理站点设置为对 MyModel
使用自定义表单