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 具有相同的目的并说明了控制流程?
所以流程是这样的:
- 在
CreateModelMixin
中实现的Viewset的create()
方法
- 创建序列化器并验证它。一旦有效,它使用视图集的
perform_create()
- 调用序列化程序的
save()
方法
- 然后调用序列化器的任一
create()
or update()
取决于实例是否传递给序列化器(它不在步骤 1 中)
create()
或 update()
然后 create/update 实例然后保存在 serializer.instance
- Viewset 然后 returns 响应数据来自
serializer.data
serializer.data
实际上是一个属性 on serializer,负责将实例序列化为dict
- 要序列化数据,使用
to_representation()
。
- 然后响应数据(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 的帮助:)
我正在为网络应用程序开发 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 具有相同的目的并说明了控制流程?
所以流程是这样的:
- 在
CreateModelMixin
中实现的Viewset的 - 创建序列化器并验证它。一旦有效,它使用视图集的
perform_create()
- 调用序列化程序的
save()
方法 - 然后调用序列化器的任一
create()
orupdate()
取决于实例是否传递给序列化器(它不在步骤 1 中) create()
或update()
然后 create/update 实例然后保存在serializer.instance
- Viewset 然后 returns 响应数据来自
serializer.data
serializer.data
实际上是一个属性 on serializer,负责将实例序列化为dict- 要序列化数据,使用
to_representation()
。 - 然后响应数据(Python dict)通过renderers呈现为输出格式,可以是json、xml等
create()
方法
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
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 的帮助:)