簡體   English   中英

django rest框架序列化器和django表單

[英]django rest framework serializers and django forms

問題 :如何在表單和序列化器中編寫用於字段驗證的DRY代碼?

示例 :我有簡單的django應用程序和模型表單,它驗證Order passengers字段:

def clean_passengers(self):
    passengers = self.cleaned_data['passengers']
    if passengers > self.flight.available_seats:
        raise forms.ValidationError(
            _(u'''Passengers count can`t be greater then seats count'''))
    return passengers

Order serializer中的驗證代碼相同:

def validate_passengers(self, attrs, source):
    passengers = attrs[source]
    if passengers > self.flight.available_seats:
        raise serializers.ValidationError(
            _(u'''Passengers count can`t be greater then seats count'''))
    return attrs

這不是干的,我寫了兩次相同的邏輯。 我怎么能避免這個? 也許我可以從表單或類似的東西繼承序列化程序。

您可以使用序列化程序反序列化並驗證表單的is_valid方法中的數據。

class MyModelForm(ModelForm):
    def is_valid(self):
        # Call super's is_valid to populate cleaned_data and do basic field validation
        valid = super(MyModelForm, self).is_valid()
        if not valid:
            return False

        serializer = MyModelSerializer(data=self.cleaned_data)
        return serializer.is_valid()

這里我為模型表單實現了可重用的驗證類。 除了重寫的get_serializer方法之外,所有原生的Django都在這里。 使用Django 1.8.13驗證工作狀態。

class RestFrameworkValidationModelForm(forms.ModelForm):
    serializer_class = None

    def get_serializer(self, *args, **kwargs):
        """
        Return the serializer instance that should be used for validating and
        deserializing input, and for serializing output.
        """
        assert self.serializer_class is not None, (
            "'%s' should either include a `serializer_class` attribute, "
            "or override the `get_serializer()` method."
            % self.__class__.__name__
        )

        return self.serializer_class(*args, **kwargs)

    def is_valid(self):
        if super(RestFrameworkValidationModelForm, self).is_valid():
            serializer = self.get_serializer(data=self.cleaned_data)
            valid = serializer.is_valid()
            self.add_error(None, serializer.errors)
            return valid
        return False

以下是用法示例:

class ExperimentForm(RestFrameworkValidationModelForm):
    serializer_class = ExperimentSerializer

    class Meta:
        model = Experiment
        exclude = []

我建議將所有驗證(如果可能)放入模型(驗證器或clean )。

然后ModelFormModelSerializer使用模式驗證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM