序列化器serializers的使用

本文介绍了在Django中如何使用序列化器serializers,包括继承serializers.Serializer自定义序列化器时需确保字段与model一致,以及在CBV视图中重写update和create方法。当使用save()时,会根据是否存在instance来调用这两个方法进行数据的添加或更新。此外,还提到了可以简化序列化过程的serializers.ModelSerializer,通过定义Meta类和指定model即可自动映射字段。

serializer.py中设置序列化器

from rest_framework import serializers
from myapp.models import Poem

class PoemSerializer(serializers.Serializer):
    id = serializers.IntegerField(read_only=True)
    title = serializers.CharField(
        max_length=20
    )
    content = serializers.CharField(
        max_length=100
    )
    price = serializers.DecimalField(
        max_digits=8,
        decimal_places=2,
    )
    def update(self, instance, validated_data):
        instance.title = validated_data.get('title')
        instance.content = validated_data.get('content')
        instance.price = validated_data.get('price')
        instance.save()
        return instance

    def create(self, validated_data):
        poem = Poem.objects.create(**validated_data)
        return poem

Poem 表

class Poem(models.Model):
title = models.CharField(
    max_length=20,
    null=False,
)
content = models.CharField(
    max_length=100,
    null=True,
)
price = models.DecimalField(
    max_digits=8,
    decimal_places=2,
)

也就是说继承(serializers.Serializer)设计序列化器时序列化器中字段名要和model类中字段名一致

views视图函数 CBV

from django.http import JsonResponse, QueryDict
from django.shortcuts import render

from django.views import View
from .serializer import *
  
  class PoemOneApi(View):
        def get(self,req):
    params = req.GET
    id = int(params.get('id')) if params.get('id') else 0

    if id:
        poem = Poem.objects.get(pk=id)
        serializer = PoemSerializer(poem)
        return JsonResponse(serializer.data)

    poems = Poem.objects.all()
    serializer = PoemSerializer(poems,many=True)
    # 有多个序列化数据。要加上safe=False
    return JsonResponse(serializer.data,safe=False)

def post(self,req):
    params = req.POST
    serializer = PoemSerializer(data=params)

    if serializer.is_valid():
        serializer.save()
    return JsonResponse(serializer.data)

def put(self,req):
    params = QueryDict(req.body)

    id = params.get('id')
    poem = Poem.objects.get(pk=id)

    serializer = PoemSerializer(instance=poem,data=params)
    if serializer.is_valid():
        serializer.save()

    return JsonResponse(serializer.data)


def delete(self,req):
    params = QueryDict(req.body)
    id = params.get('id')
    poem = Poem.objects.get(pk=id)

    serializer = PoemSerializer(poem)

    poem.delete()

    return JsonResponse(serializer.data)

继承(serializers.Serializer)时 一定要重写 update 与 create 方法
在serializer.save()时会根据instance 有无 调用 update 或 create 方法
instance可认为是符合序列化结构的数据。
如果没有instance会调用 create 也就是添加Poem表数据
如果有instance 与data 则会更新数据

因为Serializer 继承 BaseSerializer类

def update(self, instance, validated_data):
raise NotImplementedError(’update() must be implemented.’)

def create(self, validated_data):
raise NotImplementedError(’create() must be implemented.’)

不重写直接调用则会raise。而期中save方法对create 与 update
有调用

if self.instance is not None:
    self.instance = self.update(self.instance, validated_data)
    assert self.instance is not None, (
        '`update()` did not return an object instance.'
    )
else:
    self.instance = self.create(validated_data)
    assert self.instance is not None, (
        '`create()` did not return an object instance.'
    )

return self.instance

如果觉得自定义序列化器的字段十分麻烦。可以继承serializers.ModelSerializer
只要内部定义Meta类指定model 模型 与 模型字段名即可

class PoemNewSerializer(serializers.ModelSerializer):

    class Meta:
        model = Poem
        fields = ['id','title','content','price']

ModelSerializer对models常用字段进行了映射。并且重写了 updata 与create方法使得我们可以直接调用save()方法而不用重写

serializer_field_mapping = {
    models.AutoField: IntegerField,
    models.BigIntegerField: IntegerField,
    models.BooleanField: BooleanField,
    models.CharField: CharField,
    models.CommaSeparatedIntegerField: CharField,
    models.DateField: DateField,
    models.DateTimeField: DateTimeField,
    models.DecimalField: DecimalField,
    models.EmailField: EmailField,
    models.Field: ModelField,
    models.FileField: FileField,
    models.FloatField: FloatField,
    models.ImageField: ImageField,
    models.IntegerField: IntegerField,
    models.NullBooleanField: NullBooleanField,
    models.PositiveIntegerField: IntegerField,
    models.PositiveSmallIntegerField: IntegerField,
    models.SlugField: SlugField,
    models.SmallIntegerField: IntegerField,
    models.TextField: CharField,
    models.TimeField: TimeField,
    models.URLField: URLField,
    models.GenericIPAddressField: IPAddressField,
    models.FilePathField: FilePathField,
}

视图函数中使用同继承Serializer一致

流式响应(Streaming Response)和序列化器Serializers)是在 Web 开发中有效管理大容量数据传输的工具。 **流式响应**: 流式响应是指在处理大型数据集时,不立即全部生成并发送,而是按照需要逐块提供数据的方式。在 Django 中,你可以使用 `StreamingHttpResponse` 或第三方库如 `django-storages` 的 `StreamingFileResponse` 来创建这样的响应。这种方式适合于文件下载、图像流等场景。例如: ```python from django.http import StreamingHttpResponse def large_file_download(request): with open('large_file.pdf', 'rb') as file: response = StreamingHttpResponse(file, content_type='application/pdf') response['Content-Length'] = os.path.getsize('large_file.pdf') return response ``` **序列化器**: 序列化器Serializers)是 Django REST framework 提供的一种功能,用于数据的转换和验证。当你有一个复杂的 JSON 对象需要返回给客户端时,可以使用序列化器将其转换成易于解析的小部件。例如,对于一个包含大量数据的用户信息,你可以这样做: ```python # models.py class User(models.Model): # ... class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = '__all__' # 或者指定你需要序列化的字段 # views.py from rest_framework.response import Response from .serializers import UserSerializer def user_data(request, pk): user = get_object_or_404(User, pk=pk) serializer = UserSerializer(user, many=False) return Response(serializer.data, status=200) ``` 这里,当用户请求某个用户的详细信息时,只有需要的数据会被序列化并返回,避免了不必要的带宽消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值