Django6—ModelSerializer 、create,update方法


create:

1、創建序列化器對象時,如果僅僅只傳data參數
2、序列化器對象調用save方法時,會調用序列化器類中的create方法,進行數據創建操作

 

serializer = serializers.ProjectModelSerializer(data=python_data)

serializer.save(user={'name': 'xx', 'age': 18}, score=100)

return JsonResponse(serializer.data, json_dumps_params={"ensure_ascii": False})

 

update:

1、創建序列化器對象時,如果同時給data和instance傳參數
2、序列化器對象調用save方法時,會調用序列化器類中的update方法,進行數據更新操作

 serializer = serializers.ProjectSerilizer(instance=self.get_object(pk), data=python_data)

 return JsonResponse(serializer.data, json_dumps_params={"ensure_ascii": False}, status=201)

 

ModelSerializer 

1、可以繼承ModelSerializer,根據模型類來自動生成序列化器類中的字段

2、必須得指定model參數(模型類),用於指定使用的模型

3、會實現create、update方法

4、會給主鍵字段、DataTimeField(指定auto_now_add和auto_now參數),會添加read_only=True

5、會給有指定default參數的字段,添加required=False

6、會給有指定null參數的字段,添加allow_null=True

7、會給有指定blank參數的字段,添加allow_blank=True

 

 

class ProjectModelSerializer(serializers.ModelSerializer):
    """
    1、可以繼承ModelSerializer,根據模型類來自動生成序列化器類中的字段
    2、必須得指定model參數(模型類),用於指定使用的模型
    3、會實現create、update方法
    4、會給主鍵字段、DataTimeField(指定auto_now_add和auto_now參數),會添加read_only=True
    5、會給有指定default參數的字段,添加required=False
    6、會給有指定null參數的字段,添加allow_null=True
    7、會給有指定blank參數的字段,添加allow_blank=True
    """

    # 方式一:
    # a.可以重新定義模型類中的字段
    # b.重新定義的字段會覆蓋自動生成的同名字段
    # name = serializers.CharField(label='項目名稱', help_text='項目名稱', max_length=10, min_length=3,
    #                              error_messages={'min_length': '項目名稱不能少於3位', 'max_length': '項目名稱不能超過10位'},
    #                              validators=[
    #                                  UniqueValidator(queryset=Projects.objects.all(), message='項目名不能重復'),
    #                                  is_contain_keyword
    #                              ])

    # 可以將自定義的一個序列化器類作為另一個序列化器類中的字段
    interfaces = OneInterfaceSerilizer(label='所屬接口信息', help_text='所屬接口信息', read_only=True,
                                       many=True)

    # token = serializers.CharField(read_only=True)
    # email = serializers.EmailField(write_only=True)

    class Meta:
        model = Projects
        # 8、fields指定模型類中需要進行序列化操作的字段
        # a.'__all__',指定模型類中所有的字段都需要進行序列化操作
        # b.可以指定模型類中序列化操作的字段,需要在元組中指定
        # c.exclude指定不需要進行序列化操作的字段
        # d.如果指定了模型類中沒有定義的字段,那么必須在fields元組中指定,如果fields為'__all__'或者exclude除外
        # fields = '__all__'
        # fields = ('id', 'name', 'leader', 'is_execute')
        fields = ('id', 'name', 'leader', 'is_execute', 'interfaces', 'token', 'email')
        # exclude = ('create_time', 'update_time', 'is_execute')

        # 可以在Meta內部類的read_only_fields,統一指定需要添加read_only=True的字段
        read_only_fields = ('is_execute', 'desc', 'id')
        # 方式二:
        # a.可以在Meta內部類的extra_kwargs中對自動生成的序列化字段進行修改
        # b.將需要修改的字段名作為key,具體修改的內容作為value
        extra_kwargs = {
            'name': {
                'label': '項目名稱',
                'max_length': 10,
                'min_length': 3,
                'error_messages': {
                    'min_length': '項目名稱不能少於3位',
                    'max_length': '項目名稱不能超過10位'
                },
                'validators': [
                    UniqueValidator(queryset=Projects.objects.all(), message='項目名不能重復'),
                    is_contain_keyword
                ],
                'write_only': True
            }
        }

    def create(self, validated_data):
        user = validated_data.pop('user')
        score = validated_data.pop('score')
        return super().create(validated_data)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM