当前位置: 首页 > 后端技术 > Python

DRFSerializer的many参数是什么

时间:2023-03-25 23:42:00 Python

Djangorestframework什么时候需要使用many参数?构造序列化时,传入参数的QuerySet实例需要使用many=True参数,即使QuerySet长度为0或1。构造序列化时,传入参数的某个模型实例(内置User实例,或自定义模型实例),您需要使用many=false参数解析源代码不为空:self.initial_data=dataself.partial=kwargs.pop('partial',False)self._context=kwargs.pop('context',{})kwargs.pop('many',None)super().__init__(**kwargs)def__new__(cls,*args,**kwargs):如果kwargs.pop('many',False):返回cls.many_init(*args,**kwargs)返回super()。__new__(cls,*args,**kwargs)@classmethoddefmany_init(cls,*args,**kwargs):allow_empty=kwargs。pop('allow_empty',None)child_serializer=cls(*args,**kwargs)list_kwargs={'child':child_serializer,}如果allow_empty不是None:list_kwargs['allow_empty']=allow_emptylist_kwargs.update({key:valueforkey,valueinkwargs.items()ifkeyinLIST_SERIALIZER_KWARGS})meta=getattr(cls,'Meta',None)list_serializer_class=getattr(meta,'list_serializer_class',ListSerializer)returnlist_serializer_class(*args,**list_kwargs)当使用下面的语句进行序列化时,serializer=TweetSerializer(queryset,many=True)queryset会被赋值给BaseSerializer中的实例参数构造函数def__init__(self,instance=None,data=empty,**kwargs):当instance参数接受一个QuerySet实例时,需要加上many=True。如果实例接受某个模型实例,比如TweetModelclassTweetAPIView(mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView):queryset=TweetModel.objects.all()serializer_class=TweetCreateSerializerdefget(self,request:Request):returnself.列表(请求)定义列表(自我,请求,*args,**kwargs):queryset=self。filter_queryset(self.get_queryset())serializer=TweetSerializer(queryset,many=True)returnResponse(serializer.data)defpost(self,request:Request):返回self.create(request)classTweetModel(models.Model):user=models.ForeignKey(User,on_delete=models.SET_NULL,null=True)title=models.CharField(max_length=32,verbose_name='title')content=models.TextField(verbose_name='text')照片=模型。ManyToManyField(照片,空白=真)喜欢计数=模型。BigIntegerField(默认=0,空=真)comments_count=models.BigIntegerField(默认=0,空=真)read_count=models.BigIntegerField(默认=0,空=真)created_at=models.DateTimeField(auto_now_add=True))classMeta:index_together=(('user','created_at'),)def__str__(self):#这是当你执行print(tweetinstance)return'{}{}:{}'时会显示的内容。格式(self.created_at,self.user,self.content)