我对Django Rest Framework还很陌生。我在文档中找不到允许我根据JSON API标准(jsonapi.org)序列化模型的东西
假设我有以下型号。
class Person(models.Model):
name = models.CharField(max_length=200)
class Car(models.Model):
owner = models.ForeignKey(Person)
brand =
model = models.CharField(max_length=200)
plate = models.CharField(max_length=200)
我想串行化它,它将为我提供以下输出:
{
"data":[
{
"type": "Person",
"id": 1,
"attributes": {
"name": "John",
},
"relationships": {
"cars": [
{
"data": {
"type": "Car",
"id": 1,
"attributes": {
"brand": "Bugatti",
"model": "Veyron",
"plate": "PAD-305",
},
},
},
{
"data": {
"type": "Car",
"id": 2,
"attributes": {
"brand": "Bugatti",
"model": "Chiron",
"plate": "MAD-054",
},
},
},
],
},
},
{
"type": "Person",
"id": 2,
"attributes": {
"name": "Charllot",
},
"relationships": {
"cars": [
{
"data": {
"type": "Car",
"id": 3,
"attributes": {
"brand": "Volkswagen",
"model": "Passat CC",
"plate": "OIJ-210",
},
},
},
{
"data": {
"type": "Car",
"id": 4,
"attributes": {
"brand": "Audi",
"model": "A6",
"plate": "NAD-004",
},
},
},
],
},
}
],
"meta":{
"backend_runtime": "300ms", // processed at the view
}
}
您可以创建序列化程序,以任何方式返回数据。例如,如果您想忽略确切的模型结构,可以执行以下
from rest_framework import serializers
class PersonSerializer(serializers.Serializer):
"""
Person/Car serializer
"""
id = serializers.IntegerField(read_only=True)
name = serializers.CharField()
attributes = serializers.SerializerMethodField()
def get_attributes(self, obj):
return {"name": obj.name}
如果您想要一个更接近模型的序列化程序结构,可以使用以下方法关联模型序列化程序:
from rest_framework import serializers
class CarSerializer(serializers.ModelSerializer):
"""Serializes car object"""
class Meta:
model = Car
fields = ('id', 'brand',)
class PersonSerializer(serializers.ModelSerializer):
"""Serializes person and car relationship"""
car = CarSerializer(read_only=True)
class Meta:
model = Person
fields = ('id', 'name', 'car',)
在这两种情况下,都会将查询集传递给包含这些字段的序列化程序(以及嵌套模型序列化程序中的现有关系)。
解析器和渲染器是允许您更改序列化程序响应的组件。请注意,已经有第三方使用Django REST框架实现了jsonapi:https://github.com/django-json-api/django-rest-framework-json-api
如果您正在寻找一些东西,请不要忘记查看Django REST框架第三方页面。