django rest框架的控制流是什么

django rest框架的控制流是什么,django,django-rest-framework,tastypie,control-flow,Django,Django Rest Framework,Tastypie,Control Flow,我正在为一个webapp开发一个api。我最初使用的是tastypie,然后切换到django rest框架(drf)。Drf对我来说似乎很容易。我打算做的是创建嵌套的用户配置文件对象。我的模型如下 from django.db import models from django.contrib.auth.models import User class nestedmodel(models.Model): info = models.CharField(null=True, blan

我正在为一个webapp开发一个api。我最初使用的是tastypie,然后切换到
django rest框架(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')
我还有其他和外国人有关系的模型。我的序列化程序如下所示

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(自我验证的\u数据):
这样的方法,而不会出现任何问题。但是我想知道的是,
create()返回的响应应该转到哪个方法,或者换句话说,
哪个方法调用create()
。在tastype
Resources.py中,是要重写以实现自定义方法的文件。并且Resources.py包含调用方法的顺序。drf中的哪个文件具有相同的用途,并说明了控制流,如Tastype中的Resources.py

所以流程是这样的:

  • CreateModelMixin
  • 创建序列化程序并对其进行验证。一旦有效,它将使用viewset的
  • 调用序列化程序的方法
  • 然后依次调用序列化程序的或,这取决于实例是否被传递给序列化程序(步骤1中没有)
  • create()
    update()
    然后创建/更新实例,然后将其保存在
    serializer.instance
  • Viewset然后返回带有来自的数据的响应
  • 实际上是序列化程序上的一个属性,负责将实例序列化为dict
  • 要序列化数据,请使用
  • 然后将响应数据(Python dict)呈现为输出格式,通过该格式可以是json、xml等
  • 并且Resources.py包含调用方法的顺序。drf中的哪个文件具有相同的用途,并说明了控制流,如Tastype中的Resources.py


    我猜这是一个文件的组合。从您接触的类/概念的角度考虑可能更好,因为在DRF中,您可以从多个事物继承来创建您的类。所以把所有东西粘在一起的东西是。然后是各种各样的视图集混合,它们实际上将视图集粘合到序列化程序和不同的CRUD操作上。

    我自己解决了问题的第二部分。获取/创建对象可以通过使用
    def create(self、request、*args、**kwargs)中的自定义代码来完成:
    views.py中。代码如下所示。同样,为了清楚起见,这是
    views.py
    而不是serializers.py。还可以从
    request.DATA

    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:)的帮助。

    我不确定我是否理解你的问题,但这不是
    create
    a
    Response
    对象的结果,该对象包含新创建的对象,通常会返回给查看者?哦..是的。我会修改问题。谢谢你的回复。save()之后,调用什么方法返回json响应?或者它是用save()本身写的?很抱歉耽搁了。控制流在很大程度上取决于所继承的类。无论如何,我找不到一种方法来获得一个对象,如果它存在的话,或者创建一个新的。我尝试重写
    HyperLinkedModelSerializer
    以及
    Modelserializer
    save()
    create()
    方法。无论如何,控件不会传递给这两个方法。我认为
    这个字段必须是唯一的
    ,如果存在一个对象,并且该对象作为一个不可为空的字段,那么它是在验证阶段生成的。但由于django在创建对象时生成了该错误,因此它在验证时是如何产生的还不清楚。
    update\u或\u create
    并不真正适用于RESTful API。用户通过
    *-list
    URL(例如
    /api/resource/
    )上的
    POST
    创建对象,或者使用
    PUT
    更新
    *-detail
    URL上的对象(例如
    /api/resource/
    )。将两者结合起来不是一个好主意。如果您确实需要,那么您应该为此创建一个自定义路线……我发现了一个非常宝贵的资源,可以帮助您理解这些生命周期问题。我不相信DRF文档站点中没有包含这些信息,这条信息是如此重要和基本。当我想开始更改某些内容时,我非常困惑,但最终在视图集和序列化程序之间毫无线索地跳转。这个答案帮了大忙!仅供参考。您的解决方案实际上不使用任何DRF工具,如序列化程序