Django的。仅当两个Model字段都提供了用于创建和更新调用时,才检查“ unique_together”

时间:2018-11-30 10:24:56

标签: python django django-rest-framework

仅在两个字段都提供给管理员创建unique_together或通过Form请求提供了两个APIcreate调用的情况下,才需要检查update。如果发生这种情况并且字段不是unique_together,则需要将Exception传播到django-admin创建FormRestFramework的{​​{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组成。

可通过以下节点访问此模型:datetimedjango-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个流程。

1 个答案:

答案 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

使用自定义表单