django-rest-framework第一次使用使用常见问题
2018-09-04 23:48
906 查看
记录在第一次使用django-rest-framework框架使用时遇到的问题,为了便于理解在这里创建了Person和Grade这两个model
需要在模块对应的serializer.py文件中小小的修改一下
Grade在序列化的时候,就创建一个新的字段叫 person_name,指定为 serializers.CharField,而且字段使用 source 这个属性,具体而言格式为
在 models 里面 @property 装饰符先创建一个
person_name 函数,这个函数返回的是外键对应 model 的相应字段,比如 person.name。
然后,序列化的时候,指定为 serializers.ReadOnlyField() 类型
这种方法也可以增加给接口增加额外的字段
#模糊查询
首先增加一个过滤器filters.py
有时自带的过滤方法无法满足,就需要我们自定义过滤方法,例:
然后在对应的view中配置一下ViewSet
from django.db import models class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES) class Grade(models.Model): score=models.CharField(max_length=60) person = models.ForeignKey(Person, on_delete=models.CASCADE)
接口返回下拉选项对应的值
在Person这个model中的shirt_size字段 存储到数据库中的值未S/M/L,但是在前端用户需要看到他们对应value,那么我们接口如何返回呢需要在模块对应的serializer.py文件中小小的修改一下
class PersonSerializer(serializers.ModelSerializer): shirt_size_name = serializers.CharField(source='get_shirt_size_display', required=False) class Meta: model = Person fields = ('id','shirt_size', 'shirt_size_name')
接口返回外键对应的值
在Grade查询接口中返回对应外键人员的姓名,这有两种方法Grade在序列化的时候,就创建一个新的字段叫 person_name,指定为 serializers.CharField,而且字段使用 source 这个属性,具体而言格式为
CharField(source='<本model中的外键>.<外键指向的model的相应属性>')
``` class GradeSerializer(serializers.ModelSerializer): person_name = serializers.CharField(source='person.name'') class Meta: model = Grade fields = ('id','person_name') ```
在 models 里面 @property 装饰符先创建一个
person_name 函数,这个函数返回的是外键对应 model 的相应字段,比如 person.name。
然后,序列化的时候,指定为 serializers.ReadOnlyField() 类型
这种方法也可以增加给接口增加额外的字段
``` class Grade(models.Model): score=models.CharField(max_length=60) person = models.ForeignKey(Person, on_delete=models.CASCADE) ... ... @property def person_name(self): return self.person.name ``` ``` class GradeSerializer(serializers.ModelSerializer): person_name = serializers.ReadOnlyField() class Meta: model = Grade fields = ('id','person_name') ```
#模糊查询
首先增加一个过滤器filters.py
class PersonFilter(django_filters.rest_framework.FilterSet): """ 人员的过滤类 """ name = django_filters.CharFilter(name='name', lookup_expr='icontains') class Meta: model = Person fields = ('id', 'name')
有时自带的过滤方法无法满足,就需要我们自定义过滤方法,例:
class PersonFilter(django_filters.rest_framework.FilterSet): # 自定义了过滤方法person_filter person_name = django_filters.CharFilter(method='person_filter') # 通过传入的中文名模糊查询到对应90分数人的ID def person_filter(self, queryset, name, value): personList = [] qs = Grade.objects.filter(name__contains=value).filter(score='90') if qs.exists(): for q in qs: personList.append(q.id) # 返回对应人员的查询集合 return queryset.filter(id__in=userList)
然后在对应的view中配置一下ViewSet
class PersonViewSet(viewsets.ModelViewSet): """ LIST 用户列表页, 分页, 搜索, 过滤, 排序 """ ....... filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter) filter_class = StoriesFilter search_fields = ('id', 'name') ......
相关文章推荐
- Django-Rest-Framework 教程: 3. 使用 class based views
- 学习使用"Django REST framework"打造RESTful API接口——第一节 quickstart
- 使用Django rest framework api时,客户端返回结果为html标签
- django-rest-framework视图层的使用(二)
- django-rest-framework过滤器的使用(三)
- Django REST framework笔记一之简易JsonAPI搭建(可使用)
- django rest framework使用django-filter
- django使用rest_framework
- django 中api使用之django-rest-framework
- Django之REST_framework 框架基本组件使用
- .net Entity Framework + mysql 使用中常见问题
- Django 之REST framework学习:解析器parser的使用
- django-rest-framework 使用例子
- 第一次使用django开发网页遇到的问题
- jni.h no such file or directory(第一次使用JNI的常见问题)
- Android studio第一次使用常见问题
- Django REST Framework(一) 初步使用
- django使用rest_framework API认证
- django-rest-framework序列化的使用(一)
- Atlas UpdatePanel使用技巧以及常见问题