博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
django-rest-framework第一次使用使用常见问题
阅读量:6250 次
发布时间:2019-06-22

本文共 2832 字,大约阅读时间需要 9 分钟。

hot3.png

记录在第一次使用django-rest-framework框架使用时遇到的问题,为了便于理解在这里创建了Person和Grade这两个model

from django.db import modelsclass 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查询接口中返回对应外键人员的姓名,这有两种方法

  1. 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')```
  1. 在 models 里面 装饰符先创建一个 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 = PersonFilter    search_fields = ('id', 'name')    ......

转载于:https://my.oschina.net/hellotest/blog/1942564

你可能感兴趣的文章
详解Nginx 13: Permission denied 解决方案
查看>>
InPlace Transition of a matrix
查看>>
Project Euler 26 Reciprocal cycles( 分数循环节 )
查看>>
做了几道简单的基础题,慢慢熟悉循环
查看>>
元素的多种延时等待(&页面的超时处理)
查看>>
ios 后台发送邮件之SKPSMTPMessage的使用
查看>>
JavaScript学习
查看>>
3014C语言_运算符
查看>>
202702算法_二分法查找
查看>>
Win10 UWP开发实现Bing翻译
查看>>
各种不同类型的类
查看>>
mvc4 -@Html.Partial,@Html.RenderPartial
查看>>
windows2012 r2 提高网速方法
查看>>
调试R代码中出现的常用的函数
查看>>
JavaWeb 之 AJAX
查看>>
十、spark graphx的scala示例
查看>>
探秘SpringAop(一)_介绍以及使用详解
查看>>
查询指定时间内审核失败的事件日志
查看>>
problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 算法分析...
查看>>
springmvc流程
查看>>