一、作用
- 将数据序列化或反序列化
- 对提交的数据进行校验
- 对提交的数据进行处理
二、返回json的方法
创建表:
class Publisher(models.Model):
name = models.CharField(max_length=32, verbose_name="名称", unique=True)
address = models.CharField(max_length=128, verbose_name="地址")
operator = models.ForeignKey("auth.User")
def __str__(self):
return self.name
class Meta:
verbose_name = "出版社"
verbose_name_plural = verbose_name
-
自己实现
def publish_list(request):
query_list = models.Publisher.objects.all()
data=[]
from django.forms.models import model_to_dict
for i in query_list:
data.append(model_to_dict(i))
import json
return HttpResponse(json.dumps(data),content_type='application/json')
-
使用model_to_dict
def publish_list(request):
query_list = models.Publisher.objects.all()
from django.forms import model_to_dict
for data in query_list:
data=model_to_dict(data)
return HttpResponse(data, content_type='application/json')
-
使用Django自带的serializers
def publish_list(request):
query_list = models.Publisher.objects.all()
from django.core import serializers
data = serializers.serialize("json", query_list)
return HttpResponse(data, content_type='application/json')
上面几种方法虽然可以返回json数据,但是不能对传来的数据进行反序列化,引入DRF的序列化类(serializers.py)
class PublisherSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) name = serializers.CharField(max_length=32) address = serializers.CharField(max_length=128) def create(self, validated_data): return models.Publisher.objects.create(**validated_data) def update(self, instance, validated_data): instance.name = validated_data.get("name", instance.name) instance.address = validated_data.get("address", instance.address) instance.save() return instance
视图
def publish_list(request): query_list = models.Publisher.objects.all() from app01 import serializers serializer = serializers.PubliserSerializer(query_list, many=True) import json return HttpResponse(json.dumps(serializer.data), content_type='application/json')
效果:
-
使用
ModelSerializer
class PublisherSerializer(serializers.ModelSerializer):
operator = serializers.ReadOnlyField(source="operator.username")
class Meta:
model = models.Publisher
fields = (
"id",
"name",
"address",
"operator"
)
视图:
def publish_list(request):
query_list = models.Publisher.objects.all()
from app01 import serializers
serializer = serializers.PubliserSerializer(query_list, many=True)
import json
return HttpResponse(json.dumps(serializer.data), content_type='application/json')
- 序列化器类与Django
Form
类非常相似,并在各种字段中包含类似的验证标志,例如required
,max_length
和default
。- 字段标志还可以控制serializer在某些情况下如何显示,比如渲染HTML的时候。上面的
{'base_template': 'textarea.html'}
标志等同于在DjangoForm
类中使用widget=widgets.Textarea
。这对于控制如何显示可浏览器浏览的API特别有用,我们将在本教程的后面看到。- 也可以通过使用
ModelSerializer
类来节省时间,就像ModelForm一样。