django rest框架的元数据生成器
drf-metadata的Python项目详细描述
安装
pip install -e git+https://github.com/night-crawler/drf-metadata.git@#egg=drf-metadata
型号
classAuthor(models.Model):name=models.CharField(max_length=255)birth=models.DateField('birth date')def__str__(self):returnself.nameclassPublisher(models.Model):name=models.CharField(max_length=255)state=models.PositiveSmallIntegerField('publisher state',choices=((0,'Active'),(1,'Disabled')),default=1)def__str__(self):returnself.nameclassBook(models.Model):title=models.CharField(max_length=255)authors=models.ManyToManyField(Author)publisher=models.ForeignKey(Publisher)
用法
fromdrf_metadata.metaimportMetaData,AbstractField,CustomMetadataclassBookMetadata(MetaData):model=Bookserializers={'publisher':PublisherSerializer}update_fields={'authors':{'omg':{'lol':1}}}# skip serialization (don't include model instances to choice field)dataset_urls={'authors':'/author/','publisher':'/publisher/',}# custom queryset for instance (self has `obj` if you need to filter qs)defget_authors_queryset(self,field):returnAuthor.objects.filter(name='author0')# use custom serializer for field instance(s)defget_authors_serializer(self,field):# self.request, self.view, self.obj are available in MetaData instancereturnAuthorSerializer# update field bundle with runtime valuesdefupdate_authors_field_meta(field,obj):return{'new':1,'obj':str(obj)}# use own serializerdefget_publisher_field_meta(field,obj):return{'new':1,'obj':str(obj)}
与django rest framework一起使用
# or redefine OPTIONS handlerclassBookViewSet(viewsets.ReadOnlyModelViewSet):@list_route()defdescribe_book(self,request):md=metadata.BookMetadata().determine_metadata(request,self)returnResponse(md)
样品响应
{"title":"book","description":"description","fields":[{"type":"CharField","max_length":255,"name":"title","verbose_name":"title","help_text":"","blank":false,"null":false,"editable":true,"required":true},{"type":"ForeignKey","name":"publisher","verbose_name":"publisher","help_text":"","blank":false,"null":false,"editable":true,"required":true,"data":[{"id":47,"name":"pub0"},{"id":48,"name":"pub1"},{"id":49,"name":"pub2"}]},{"type":"ManyToManyField","name":"authors","verbose_name":"authors","help_text":"","blank":false,"null":false,"editable":true,"required":true,"data":[{"id":37,"name":"author0"},{"id":38,"name":"author1"},{"id":39,"name":"author2"}]}]}
非模型元数据
classImpersonateMetadata(CustomMetadata):title='View site as another user'action_name='Impersonate'fields=(AbstractField(type='ForeignKey',name='user_id',verbose_name='User',data='/data/',required=True),)# method fieldsdefget_superfield(self,request):return{'name':'hero','super':True}defget_lol(self,request):return{'name':'lol','super':False}# update field `user_id`defget_field_user_id(self,field_name,request):return{'lol':1}