django rest framework

时间:2015-08-05 06:12:50

标签: django django-rest-framework tastypie control-flow

我正在为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)

我有其他具有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')

我可以覆盖像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之类的控制流程。

2 个答案:

答案 0 :(得分:17)

所以流程如下:

  1. CreateModelMixin
  2. 中实施的Viewset的create()方法
  3. 创建序列化程序并验证它。一旦有效,它就会使用viewset的perform_create()
  4. 调用序列化程序的save()方法
  5. 然后依次调用序列化程序create()update(),具体取决于是否将实例传递给序列化程序(它不在步骤1中)
  6. create()update()然后创建/更新实例,然后将其保存在serializer.instance
  7. Viewset然后返回来自serializer.data
  8. 的数据的响应
  9. serializer.data实际上是序列化程序的一个属性,它负责将实例序列化为字典
  10. 要序列化数据,请使用to_representation()
  11. 然后响应数据(Python dict)通过renderers呈现为输出格式,可以是json,xml等。
  12.   

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

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

答案 1 :(得分:1)

我自己想出了问题的第二部分。可以使用def create(self, request, *args, **kwargs):中覆盖views.py中的自定义代码来完成get / create对象。代码如下所示。再次,为清楚起见,这是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的帮助:)