大佬教程收集整理的这篇文章主要介绍了Django REST Framework POST嵌套对象,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
你的问题涉及DRF中的复杂问题,因此需要进行一些解释和讨论,以了解序列化程序和视图集的工作方式。
我将讨论代表你的问题Subject
,并Class
通过使用不同的http方法数据的不同表示通过相同的端点数据,因为这通常是当人们希望代表自己的嵌套格式的数据的问题; 他们希望为用户界面提供足够的信息以供清洁使用,例如通过下拉选择器。
默认情况下,Django和Django REST Framework(DRF )通过其主键引用相关对象(your Subject和Class
)。默认情况下,这些是使用Django自动递增的整数键。如果要通过其他方式引用它们,则必须为此编写重写。有几种不同的选择。
Class
用由复合(数字,字母)搜索词组成的复合搜索。例如,你可以在create
视图方法中覆盖相关的对象查找(对于POST),但是随后你也必须在update
视图方法中处理类似的查找(对于PUT和PATCH)。将嵌套的类序列化器设置为只读:
class Examserializer(serializers.Modelserializer):
subject = Subjectserializer(read_only=TruE)
clazz = Classserializer(read_only=TruE)
覆盖视图的创建,以在自由格式属性上查找相关类。此外,请检查DRF如何通过mixins实现此功能。你还必须重写update方法以正确处理这些问题,并且如果采取以下方法PATCH,除了PUT(更新)之外,还应考虑(部分更新)支持:
def create(self, request):
# Look up objects by arbitrary attributes.
# You can check here if your students are participaTing
# the classes and have taken the subjects they sign up for.
subject = get_object_or_404(Subject, title=request.data.get('subject'))
clazz = get_object_or_404(
Class,
number=request.data.get('clazz_number')
letter=request.data.get('clazz_letter')
)
serializer = self.get_serializer(data=request.data)
serializer.is_valID(raise_exception=TruE)
serializer.save(clazz=clazz, subject=subject)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.http_201_CREATED, headers=headers)
选项2:专用于序列化器进行读写和使用主键;这是惯用的方法:
首先定义一个你希望用于常规操作(POST,PUT,PATCH)的默认Modelserializer:
class Examserializer(serializers.Modelserializer)
class Meta:
model = Exam
fIElds = ('ID', 'subject', 'clazz', 'topic', 'date', 'details')
然后,使用你要提供给它们的表示形式来覆盖必填字段,以读取数据(GET):
class ExamReadserializer(Examserializer):
subject = Subjectserializer(read_only=TruE)
clazz = Classserializer(read_only=TruE)
然后为VIEwSet 指定要用于不同操作的序列化器。在这里,我们返回嵌套的Subject和Class数据以进行读取操作,但仅将其主键用于更新操作(更为简单):
class ExamVIEwSet(vIEwsets.ModelVIEwSet):
queryset = Exam.objects.all()
def get_serializer_class(self):
# define your http method-to-serializer mapPing freely.
# This also works with CoreAPI and Swagger documentation,
# which produces clean and readable API documentation,
# so I have chosen to belIEve this is the way the
# Django REST Framework author intended things to work:
if self.request.method in ['GET']:
# Since the Readserializer does nested lookups
# in multiple tables, only use it when necessary
return ExamReadserializer
return Examserializer
如你所见,选项2似乎不太复杂且不易出错,在DRF(get_serializer_class实现)之上仅包含3行手写代码。只需让框架的逻辑为你找出对象的表示形式以及对象的创建和更新。
我看到了许多其他方法,但是到目前为止,这些方法为我提供了最少的代码来维护,并以干净的方式利用DRF的设计。
我现在在使用Django Rest Framework时遇到一个小问题。我正在尝试发布一个带有嵌套对象的对象。
class Classserializer(serializers.Modelserializer):
class Meta:
model = Class
fields = ('number','letter')
class Subjectserializer(serializers.Modelserializer):
class Meta:
model = Subject
fields = ('title',)
class Examserializer(serializers.Modelserializer):
subject = Subjectserializer()
clazz = Classserializer()
class Meta:
model = Exam
fields = ('id','subject','clazz','topic','date','details')
depth = 1
def create(self,validated_data):
return Exam.objects.create(**validated_data)
def update(self,instance,validated_data):
instance.__Dict__.update(**validated_data)
instance.save()
return instance
而create()
来自views.py
:
def create(self,request):
serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=TruE)
self.perform_create(serializer)
return Response(serializer.validated_data,status=status.http_201_CREATED)
我在这里阅读了一些有关此问题的文章,但我仍然坚持。我已尝试通过多种方式对其进行修复,但仍在恢复中"This field is required."
。
以上是大佬教程为你收集整理的Django REST Framework POST嵌套对象全部内容,希望文章能够帮你解决Django REST Framework POST嵌套对象所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。