从django-rest-framework后端返回嵌套JSON响应的正确方法

时间:2017-12-17 15:15:23

标签: python django-rest-framework

我已经在高级别使用django-rest-framework了一段时间,但我仍然相对较新的网络api并且我不完全确定是什么最佳实践是构造用于处理相关数据的序列化程序。以下是我设置的示例(这是我所获得的淡化版本)。

models.py

class Client(models.Model):
    client_name = models.CharField(max_length=50)
    email = models.CharField(max_length=50)


class Project(models.Model):
    project_name = models.CharField(max_length=100)
    budget = models.FloatField()
    start_date = models.DateField()
    end_date = models.DateField()
    client = models.ForeignKey(Client, related_name="projects")

serializers.py

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Client
        fields = (
            'id',
            'url',
            'client_name',
            'email',
        )


class ProjectSerializer(serializers.ModelSerializer):
    client = ClientSerializer

    class Meta:
        model = models.Project
        fields = (
            'id',
            'url',
            'project_name',
            'budget',
            'start_date',
            'end_date',
            'client',
        )

views.py

class ClientViewSet(viewsets.ModelViewSet):
    queryset = models.Client.objects.all()
    serializer_class = serializers.ClientSerializer


class ProjectViewSet(viewsets.ModelViewSet):
    queryset = models.Project.objects.all()
    serializer_class = serializers.ProjectSerializer

现在我的问题是......什么是最佳实践'用于在json响应中返回相关数据?根据上面的例子,我可以请求项目列表,在一个api调用中,我也可以在我的redux商店中缓存相关的客户端信息。但是,当我添加一个项目时,我必须使用完全充实的Client对象而不仅仅是主键来构造POST。我已经能够通过使用默认的PrimaryKeyRelatedField为GET和POST设置嵌套的序列化器来使其工作,但这似乎是违反直觉的...这是我看到我的选项的方式:

  1. 如上所述,花费额外的时间对api视图进行编码,以便为GET和PK序列化器使用嵌套序列化器进行POST / UPDATE。
  2. 对所有http请求使用与PrimaryKeyRelatedFields或HyperLinkedRelatedFields相同的序列化程序,但必须在我的redux客户端中菊花链式api调用,以便我可以收集并显示相关信息(我不认为它会是好的练习多次点击api,特别是当嵌套结构可以深入了解更复杂的模型时)。
  3. 对于更一般的问题,菊花链api调用的接受做法是什么(GET / projects / => for-each project GET / client /:id)。这似乎是一个很大的禁忌,但也许我错了......我的理解是,你会受到限制,因为公众api会这样做。这是对的吗?

0 个答案:

没有答案