簡體   English   中英

如何在Django Rest框架中驗證模型?

[英]How to validate a model in django rest framework?

我有一個模型,它實質上是一個包含四個查找表的單個表。 查找表之一是指定類型。 根據類型(共有四種),對字段的要求會發生變化。 例如,如果類型為“調查”,則必須輸入number_of_unique_contacts字段,但其他任何類型都不需要。

我考慮過使用基於模型繼承的多表和DB模式。 但這是沒有意義的,因為只有四種類型,並且只有6個字段根據類型在“上下文相關”的范圍內起作用。 話雖如此,我將對Django內部的多個模型開放,但是我更喜歡REST框架僅提供一個URI(每個TYPE都不一個)。

當前的問題是:在POST / PUT請求上驗證模型的最佳方法是什么? 我是否最好選擇另一個數據庫模式(如上所述,我認為我覺得合適)? 是否應該重組我的python模型(還是一個具有四個查詢的主類)?

我是Django和python的新手,所以請保持柔和(.NET / Java背景)。 並先謝謝你

我認為是相關的代碼(老實說,該代碼可能無關緊要,因為這更多是一個設計問題,但是我總是覺得很奇怪地發布了沒有代碼的內容-至少出於上下文考慮)

class MySerializer(serializers.ModelSerializer):
    proposal_side = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_side')
    my_proposal_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_type')
    my_proposal_delivery_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='delivery_type')
    my_survey_method = serializers.SlugRelatedField(many=False, read_only=False, slug_field='method')
    class Meta:
        model = diliModels.Proposal
        fields = (
            'id'
            ,'my_proposal_side'
            ,'my_proposal_type'
            ,'number_of_participants'
            ,'cost_per_participants'
            ,'minimum_dollar_commitment'
            ,'commercial_terms'
            ,'is_publicly_visible'
            ,'is_anonymous'
            ,'is_republish'
            ,'name'
            ,'my_delivery_type'
            ,'my_survey_method'
            ,'number_of_unique_contacts'
            ,'availability_start'
            ,'availability_end'
            ,'location_country'
            ,'location_city'
            ,'location_state'
            ,'description'
            ,'desired_meetings'
        )


class MyViewSet(viewsets.ModelViewSet):
    paginate_by = 100

    queryset = myModels\
        .MyProposal\
        .objects\
        .prefetch_related('blah')
    print 'SQL::MyViewSet: ' + str(queryset.query)
    serializer_class = serializers.MySerializer

將驗證方法添加到序列化器類是一種選擇

class MySerializer(serializers.ModelSerializer):
    proposal_side = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_side')
    my_proposal_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='proposal_type')
    my_proposal_delivery_type = serializers.SlugRelatedField(many=False, read_only=False, slug_field='delivery_type')
    my_survey_method = serializers.SlugRelatedField(many=False, read_only=False, slug_field='method')
    class Meta:
        model = diliModels.Proposal
        fields = (
            'id'
            ,'my_proposal_side'
            ,'my_proposal_type'
            ,'number_of_participants'
            ,'cost_per_participants'
            ,'minimum_dollar_commitment'
            ,'commercial_terms'
            ,'is_publicly_visible'
            ,'is_anonymous'
            ,'is_republish'
            ,'name'
            ,'my_delivery_type'
            ,'my_survey_method'
            ,'number_of_unique_contacts'
            ,'availability_start'
            ,'availability_end'
            ,'location_country'
            ,'location_city'
            ,'location_state'
            ,'description'
            ,'desired_meetings'
        )

    def validate(self, attrs):
         raise serializers.ValidationError("error")
         return attrs

暫無
暫無

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

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