您的位置:首页 > 编程语言 > Python开发

Python Django REST framework 常用技巧

2018-02-24 21:47 861 查看
条件过滤
常用过滤

实例

接口使用
多级列表

get查找 默认非ID
不用版本 不同api

浏览次数

过滤当前用户

多参数使用

条件过滤

常用过滤

_exact 精确等于 like ‘aaa’

__iexact 精确等于 忽略大小写 ilike ‘aaa’

__contains 包含 like ‘%aaa%’

__icontains 包含 忽略大小写 ilike ‘%aaa%’,但是对于sqlite来说,contains的作用效果等同于icontains。

__gt 大于

__gte 大于等于

__lt 小于

__lte 小于等于

__in 存在于一个list范围内

__startswith 以…开头

__istartswith 以…开头 忽略大小写

__endswith 以…结尾

__iendswith 以…结尾,忽略大小写

__range 在…范围内

__year 日期字段的年份

__month 日期字段的月份

__day 日期字段的日

__isnull=True/False

实例

class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
"""
商品列表页
"""
# 过滤大于 100 的价格才返回
queryset = Goods.objects.all().filter(shop_price__gt=100)
serializer_class = GoodsSerializer
pagination_class = Pagination


接口使用

多级列表

三级列表,默认 ModelSerializer 并不能满足需求

class CategorySerializer3(serializers.ModelSerializer):
class Meta:
model = GoodsCategory
fields = "__all__"

class CategorySerializer2(serializers.ModelSerializer):
sub_cat = CategorySerializer3(many=True)
class Meta:
model = GoodsCategory
fields = "__all__"

class CategorySerializer(serializers.ModelSerializer):
sub_cat = CategorySerializer2(many=True)
class Meta:
model = GoodsCategory
fields = "__all__"


get查找 默认非ID

class UpdatesTinkerViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
Tinker 热更新列表
"""
queryset = UpdateTinker.objects.all()
serializer_class = UpdatesSerializer
# 如不指定,默认以 id 为标准
lookup_field = "tinkerId"


不用版本 不同api

http://www.django-rest-framework.org/api-guide/versioning/#varying-behavior-based-on-the-version

def get_serializer_class(self):
if self.request.version == 'v1':
return AccountSerializerVersion1
return AccountSerializer


浏览次数

class GoodsListViewSet(mixins.RetrieveModelMixin, viewsets.GenericViewSet):
# get 方法时,调用一次 点击次数 + 1
def retrieve(self, request, *args, **kwargs):
instance = self.get_object()
instance.click_num += 1
instance.save()
serializer = self.get_serializer(instance)
return Response(serializer.data)


过滤当前用户

只显示当前用户的列表

def get_queryset(self):
return UpdateTinker.objects.filter(user=self.request.user)


多参数使用

class UpdatesTinkerFilter(FilterSet):
"""
商品的过滤filter
"""
applicationId = filters.CharFilter(name="applicationId", lookup_expr='iexact')
version = filters.CharFilter(name="version", lookup_expr='iexact')

class Meta:
model = UpdateTinker
fields = ['applicationId', 'version']

class UpdatesTinkerViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
"""
Tinker 热更新列表
"""
queryset = UpdateTinker.objects.all()
serializer_class = UpdatesSerializer
pagination_class = UpdatesTinkerPagination
filter_backends = (DjangoFilterBackend,)
search_fields = ('applicationId', 'version')
# 查找过滤class
filter_class = UpdatesTinkerFilter
# 默认搜索 tinkerId
lookup_field = "tinkerId"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DRF 前后端分离 django