什么是django休息框架的控制流程

cut*_*eth 6 django control-flow tastypie django-rest-framework

我正在为webapp开发api.我最初使用tastypie并切换到django-rest-framework (drf).Drf对我来说似乎很容易.我打算做的是创建嵌套的用户配置文件对象.我的模型如下

from django.db import models
from django.contrib.auth.models import User

class nestedmodel(models.Model):
    info = models.CharField(null=True, blank=True, max_length=100)


class UserProfile(models.Model):
    add_info = models.CharField(null=True, blank=True, max_length=100)
    user = models.OneToOneField(User)
    nst = models.ForeignKey(nestedmodel)
Run Code Online (Sandbox Code Playgroud)

我有其他具有Foreignkey Relation的模型.我的序列化器如下

from django.contrib.auth.models import User, Group
from rest_framework import serializers
from quickstart.models import UserProfile, nestedmodel


class NestedSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = nestedmodel
        fields = ('info', )

class UserSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = User
        fields = ('url', 'username', 'email', 'groups')


class GroupSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Group
        fields = ('url', 'name')

class UserProfileSerializer(serializers.HyperlinkedModelSerializer):
    user = UserSerializer()
    nst = NestedSerializer()
    class Meta:
        model = UserProfile
        user = UserSerializer(many=True)
        nested = NestedSerializer(many=True)
        fields = ('nst', 'user')
Run Code Online (Sandbox Code Playgroud)

我可以覆盖create(self, validated_data):没有任何问题的方法.但我想知道的是to which method should the response returned by create() goes,或者换句话说Which method calls create().在tastypie中Resources.py是要覆盖以实现自定义方法的文件.Resources.py包含调用方法的顺序.drf中的文件用于同一目的,并说明了tastypie中的Resources.py之类的控制流程.

mik*_*725 19

所以流程如下:

  1. Viewset的create()方法实现于CreateModelMixin
  2. 这会创建序列化程序并验证它.一旦有效,它就会使用viewsetperform_create()
  3. 这会调用序列化程序的save()方法
  4. 然后依次调用序列化程序create()update()依赖实例是否传递给序列化程序(它不是在步骤1中)
  5. create()或者update()然后创建/更新然后保存的实例serializer.instance
  6. Viewset然后返回来自的数据的响应 serializer.data
  7. serializer.data 实际上是序列化程序的一个属性,它负责将实例序列化为dict
  8. to_representation()使用序列化数据.
  9. 然后通过渲染器将响应数据(Python dict)渲染为输出格式,渲染器可以是json,xml等

Resources.py包含调用方法的顺序.drf中的文件用于同一目的,并说明了tastypie中的Resources.py之类的控制流程.

猜猜这将是文件的组合.从你接触的类/概念来考虑它可能更好,因为在DRF中你可以继承多个东西来创建你的类.因此将所有内容粘合在一起的东西就是视图集.然后有各种视图集mixins实际上将视图集粘合到序列化器和不同的CRUD操作.

  • 不敢相信 DRF 文档网站中没有包含此信息,这条信息是如此重要和基础。当我想开始更改某些内容时非常困惑,但最终在视图集和序列化器之间跳跃而没有任何线索。这个答案帮助很大! (2认同)