簡體   English   中英

進行驗證時將提取字段添加到Django模型序列化器

[英]Add extract fields to Django model serializer while doing validations

假設我有以下模型和modelSerializer:

models.py

class Approve(models.Model):
    process = models.IntegerField(verbose_name='Associated Process')
    content = models.CharField(max_length=300, verbose_name="Approval Content")

serializers.py

class ApproveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Approve
        fields = ('id', 'process' ,'content')
    def validate(self, value):
        process = value['process']
        try:
            something_else = Something.objects.get(process)
        except Something.DoesNotExist:
            raise serializers.ValidationError('Invalid Process')
        return value


問題是我想在serializers.py中而不是views.py中驗證傳入的數據。 您會注意到,為了進行驗證檢查,我在數據庫中查詢了something_else

問題是我想在views.py中使用此對象something_else ,而不是進行另一個數據庫查詢。 有什么方法可以與序列化程序一起傳遞它,而在調用serializer.is_valid()方法時不會引起序列化程序驗證錯誤。


任何建議都將受到歡迎,在此先感謝。

好吧,我不確定您的views.py看起來如何,但從本質views.py ,您將需要在此處實例化序列化程序:

def approve_view(request):
    if request.method == "POST":
        process = request.POST.get('value', None)
        something_else = Something.objects.filter(process=process).first()
        serializer = ApproveSerializer(something_else=something_else) # This is where you pass the something_else object. 
        if serializer.is_valid():
             # Your code for successful validation.
        else:
             # Your code for failed validation

現在,您已經將something_else傳遞到ApproveSerializer ,您需要將其設置為屬性:

class ApproveSerializer(serializers.ModelSerializer):
    def __init__(self, something_else=None):
        self.something_else = something_else

    class Meta:
        model = Approve
        fields = ('id', 'process' ,'content')

    def validate(self, value):
        process = value['process']
        if not self.something_else:
             raise serializers.ValidationError('Invalid Process')
    return value

我想出一種解決問題的方法。

serializers.py

class ApproveSerializer(serializers.ModelSerializer):
    class Meta:
        model = Approve
        fields = ('id', 'process' ,'content')
    def validate(self, value):
        process = value['process']
        try:
            something_else = Something.objects.get(process)
            value['something_else'] = something_else
        except Something.DoesNotExist:
            raise serializers.ValidationError('Invalid Process')
        return value

views.py在調用serializer.save()方法之前,應彈出已添加到序列化程序中的值。

def post(self, request):
    serializer = ApproveSerializer(data=request.data)
    if serializer.is_valid():
        something_else = serializer.validated_data.pop('something_else')
        something_else.property = new_property
        something_else.save()
        serializer.save()
    else:
        # Error handling goes here serialzier.errors

不確定這是否是個好習慣,但至少現在對我有用。 希望知道更好的解決方案。

暫無
暫無

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

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