django rest框架的控制流程是什么

what is the control flow of django rest framework

我正在为网络应用程序开发 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)

我还有其他具有外键关系的模型。我的序列化程序如下

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

我可以毫无问题地覆盖 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 具有相同的目的并说明了控制流程?

所以流程是这样的:

  1. CreateModelMixin
  2. 中实现的Viewset的create()方法
  3. 创建序列化器并验证它。一旦有效,它使用视图集的 perform_create()
  4. 调用序列化程序的 save() 方法
  5. 然后调用序列化器的任一 create() or update() 取决于实例是否传递给序列化器(它不在步骤 1 中)
  6. create()update() 然后 create/update 实例然后保存在 serializer.instance
  7. Viewset 然后 returns 响应数据来自 serializer.data
  8. serializer.data实际上是一个属性 on serializer,负责将实例序列化为dict
  9. 要序列化数据,使用 to_representation()
  10. 然后响应数据(Python dict)通过renderers呈现为输出格式,可以是json、xml等

And Resources.py contains the order in which methods are being called. Which is the file in drf that serves the same purpose and illustrates the control flow like Resources.py in tastypie?.

猜想那是文件的组合。最好根据你正在触摸的 classes/concepts 来思考,因为在 DRF 中你可以继承多个东西来创建你的 类。所以将所有东西粘合在一起的东西是 viewsets。然后是各种视图集混合,它们实际上将视图集粘合到序列化程序和不同的 CRUD 操作。

我自己想出了问题的第二部分。 get/create 对象可以通过在 views.py 中覆盖 def create(self, request, *args, **kwargs): 中使用自定义代码来完成。代码如下粘贴。再一次,为清楚起见,这是 views.py 而不是 serializers.py。也可以从 request.DATA

访问带有发布值的 json
class NestedViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows Nested objects to be viewed or edited.
    """
    queryset = nestedmodel.objects.all()
    serializer_class = NestedSerializer
    def create(self, request, *args, **kwargs):
        info = request.DATA['info']
        user = User.objects.get(username=request.DATA['user']['username'])
        profile = UserProfile.objects.get(user=user)
        nst = nestedmodel.objects.create(info=info, user=user, profile=profile)
        serialized_obj = serializers.serialize('json', [ nst, ])
        json_serialized = json.loads(serialized_obj)
        data = json.dumps(json_serialized[0])
        return Response(data)

感谢 @miki275 的帮助:)