Python 如何在django rest框架中验证模型?

Python 如何在django rest框架中验证模型?,python,django,rest,django-rest-framework,Python,Django,Rest,Django Rest Framework,我有一个模型,它本质上是一个包含四个查找表的单表。查找表之一是指定类型。根据类型(共有四种),对字段的要求会发生变化。例如,如果类型为“调查”,则需要唯一联系人的字段号,但不适用于任何其他类型 我考虑使用多表和基于建模继承的DB模式。但这并没有什么意义,因为只有四种类型,并且只有6个字段作为依赖于该类型的“上下文必需”发挥作用。也就是说,我会对Django内部的多个模型开放,但我更喜欢REST框架只提供一个URI(而不是每种类型一个URI) 现在的问题是:在POST/PUT请求上验证模型的最佳方

我有一个模型,它本质上是一个包含四个查找表的单表。查找表之一是指定类型。根据类型(共有四种),对字段的要求会发生变化。例如,如果类型为“调查”,则需要唯一联系人的字段号,但不适用于任何其他类型

我考虑使用多表和基于建模继承的DB模式。但这并没有什么意义,因为只有四种类型,并且只有6个字段作为依赖于该类型的“上下文必需”发挥作用。也就是说,我会对Django内部的多个模型开放,但我更喜欢REST框架只提供一个URI(而不是每种类型一个URI)

现在的问题是:在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'
        )

    def validate(self, attrs):
         raise serializers.ValidationError("error")
         return attrs
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