【问题标题】:Django Rest Framework approach for JSON API standardsJSON API 标准的 Django Rest Framework 方法
【发布时间】:2016-09-06 02:45:08
【问题描述】:

我对 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
    }
}

【问题讨论】:

  • 我很确定您必须手动将模型转换为该形式
  • 我认为这会违反 ORM 原则。我不应该设计我的模型来用特定的 JSON 结构来表示它。我想知道有什么 DRF 工具可以灵活地表示它。
  • 我猜这是github.com/django-json-api ...

标签: python json django rest django-rest-framework


【解决方案1】:

您可以创建序列化程序以任何您想要的方式返回数据。例如,如果您想忽略确切的模型结构,您可以执行以下操作

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',)

在这两种情况下,您都会将查询集传递给包含这些字段的序列化程序(以及在嵌套模型序列化程序中,现有关系)。

【讨论】:

    【解决方案2】:

    解析器和渲染器是允许您更改序列化程序响应的组件。 请注意,已经有第三方使用 Django REST 框架实现了 jsonapi:https://github.com/django-json-api/django-rest-framework-json-api

    如果您正在寻找东西,请不要忘记查看Django REST framework third party page

    【讨论】:

      猜你喜欢
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2012-12-07
      • 2020-12-03
      • 2020-04-23
      相关资源
      最近更新 更多