我已经在高级别使用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设置嵌套的序列化器来使其工作,但这似乎是违反直觉的...这是我看到我的选项的方式:
对于更一般的问题,菊花链api调用的接受做法是什么(GET / projects / => for-each project GET / client /:id)。这似乎是一个很大的禁忌,但也许我错了......我的理解是,你会受到限制,因为公众api会这样做。这是对的吗?