Python 使用 args 和 kwarg 来验证序列化器中的数据



好吧,我正在构建这个django rest api,我的用户可以在其中发送一些数据,并将它们保存到数据库中。在那里,我需要在将他们发送的数据保存到数据库之前对其进行验证。

我已经添加了验证器,例如,

def validate(self, value):
    UnitOfMeasureName = ["Each", "Grams", "Ounces", "Pounds", "Kilograms", "Metric Tons"]
    if value in UnitOfMeasureName:
        return True
    else:
        return ValidationError('Invalid')
在序列化程序

内部,但每个序列化程序都需要实现多个这样的验证。所以我正在寻找一种可以使用一个函数进行所有这些验证的方法。我正在考虑使用argskwargs但不知道如何进行。我在想这样的事情:

def validate_all(*args, **kwargs):
    if not validation_1:
        validation_error = {add the error messsage to the dic}
    if not validation_2:
        ...
    if not validation_3:
        ...
    return validation_error

示例序列化程序:

class TransSerializer(serializers.ModelSerializer):
    def validate(self, data):
        if not data['unitofmeasurename'] in UnitOfMeasureName:
            raise serializers.ValidationError("INVALID")
        return data
    class Meta:
        model = Trans
        fields = ('unitofmeasurename','name')

因此,在另一个序列化程序中,我需要检查'unitofmeasurename''name'的验证。有没有办法只使用一个通用函数来实现这一点?请有任何想法。提前谢谢。

你可以执行以下操作:

模型

from your_app.mixins import ValidationMixin
class YourSerializer(ModelSerializer, ValidationMixin):
    def create(self, validated_data):
        # First check
        self.raise_if_something_wrong(validated_data['value'])
        # Second check
        self.get_object_if_exist(validated_data['title'])
        # This will happen ONLY if your previous check's were ok
        your_model = YourModel.objects.create(
            **validated_data
        )
        return your_model

混入

from django.conf import settings
from rest_framework.serializers import ValidationError
class ValidationMixin:
    def raise_if_something_wrong(self, value):
        if value not in settings.UNIT_OF_MEASURE_NAME:
            raise ValidationError(
                'Invalid'
            )
        else:
            pass
    def get_object_if_exist(self, obj_title):
        try:
            return YourModel.objects.get(title=obj_title)
        except YourModel.DoesNotExist:
            raise ValidationError(
                'Cant get that object'
            )

设置

还可以将其添加到项目的主settings.py文件中,将其保留为元组:

UNIT_OF_MEASURE_NAME = (
    'Each',
    'Grams',
    'Ounces',
    'Pounds',
    'Kilograms',
    'Metric Tons'
)

因此,您将能够在要验证数据的任何地方使用ValidationMixin,并将验证逻辑保存在一个位置。

最新更新