Django REST framework 支持多个id的过滤器

本文由Scarb发表于金甲虫的博客,转载请注明出处

Django REST framework 支持多个id的过滤器

需求

希望在api中可以筛选多个ID,返回多个对象。

1
http://api.example.com/api/users/?ids=1,2,3,5,7

阅读全文

Django REST framework 在序列化器中显示关联表的额外域值

本文由Scarb发表于金甲虫的博客,转载请注明出处

DRF 在序列化器中显示关联表的额外域值

需求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# models.py
from django.db import models

class Member(models.Model):
name = models.CharField(max_length = 20)
groups = models.ManyToManyField('Group', through = 'Membership')

class Group(models.Model):
name = models.CharField(max_length = 20)

class Membership(models.Model):
member = models.ForeignKey('Member')
group = models.ForeignKey('Group')
join_date = models.DateTimeField()

需要将join_date在GroupList中显示出来

最终访问Member时希望收到的返回结果是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
'id' : 2,
'name' : 'some member',
'groups' : [
{
'id' : 55,
'name' : 'group 1'
'join_date' : 34151564
},
{
'id' : 56,
'name' : 'group 2'
'join_date' : 11200299
}
]
}

阅读全文

Django REST framework 在序列化器中添加额外域

本文由Scarb发表于金甲虫的博客,转载请注明出处

DRF 在View中为不同的HTTP方法指定不同的序列化器

需求

在序列化器中添加额外域,域的值由某个函数生成。或者用于修改某个域的名称

解决方法

使用SerializerMethodField

1
2
3
4
5
6
7
8
9
class FooSerializer(serializers.ModelSerializer):
my_field = serializers.SerializerMethodField('is_named_bar')

def is_named_bar(self, foo):
return foo.name == "bar"

class Meta:
model = Foo
fields = ('id', 'name', 'my_field')

serializermethodfield

阅读全文

Django REST framework 在View中为不同的HTTP方法指定不同的序列化器

本文由Scarb发表于金甲虫的博客,转载请注明出处

DRF 在View中为不同的HTTP方法指定不同的序列化器

解决方法

重载View的get_serializer_class方法

阅读全文

Django REST framework 中为一个模型创建多个Serializer和View

本文由Scarb发表于金甲虫的博客,转载请注明出处

DRF中为一个模型创建多个Serializer和View

需求

同一个模型在不同地方需要展示不同的字段,一个序列化器无法根据场景修改序列化和反序列化的字段。

阅读全文

Django REST framework 过滤器

本文由Scarb发表于金甲虫的博客,转载请注明出处

Django REST framework 过滤器

1. 设置过滤器

与分页一样,过滤器也可以全局设置或者对某个View设置。

1.1 全局设置

要使用DjangoFilterBackend,首先要安装django_filters

1
pip install django-filter

修改settings.pyDEFAULT_FILTER_BACKENDS参数

1
2
3
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

1.2 对某个View设置

修改View的filter_backendsfilter_fields参数

1
2
3
4
5
class ProductList(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = (DjangoFilterBackend,)
filter_fields = ('category', 'in_stock')

阅读全文

Django REST framework 自定义分页

本文由Scarb发表于金甲虫的博客,转载请注明出处

Django REST framework 自定义分页

需求:在分页结果中返回当前页码、当前每页对象数,对象总数和数据。

DRF默认的分页类型无法实现,于是查看了文档,实现了自定义的分页类型。

1. 设置分页

DRF有两种方式来设置分页,一种是在全局设置中设置分页类型,另一种是对于某个View设置分页类型。

1.1 全局设置分页类型

settings.py中设置DEFAULT_PAGINATION_CLASS,即可对全部的View应用分页。

1
2
3
4
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100
}

1.2 对某个View设置分页类型

可以对某个View设置分页类型,只要修改pagination_class即可。

1
2
3
4
class BillingRecordsView(generics.ListAPIView):
queryset = Billing.objects.all()
serializer_class = BillingRecordsSerializer
pagination_class = PageNumberPagination

阅读全文

Django REST framework manytomany relationship with extra fields DRF中有外部域的多对多关系处理

本文由Scarb发表于金甲虫的博客,转载请注明出处

Django REST framework manytomany relationship with extra fields DRF中有外部域的多对多关系处理

在开发中,模型会存在多对多关系,并且多对多关系中可能会有额外的域。
这种情况下用DRF框架生成API会比较复杂,POST和PUT方法的处理也很复杂。
在这里记录一下这几天找到的一些解决方法。

1. 问题模型

Django官方文档中提到了这种特定的问题,要使用through参数指定一个额外的连接模型表,这样就可以在额外的模型表中添加域。
官方文档给出的模型如下,是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from django.db import models

class Person(models.Model):
name = models.CharField(max_length=128)

def __str__(self):
return self.name

class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')

def __str__(self):
return self.name

class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)

阅读全文

Django REST framework 官方教程 笔记

本文由Scarb发表于金甲虫的博客,转载请注明出处

Django REST framework 官方教程 笔记

Django REST framework是一个django框架,可以快速生成RESTful API,并且会生成一个基于django模板和dataForm的UI界面,可以方便地查询和操作APi。

官方教程分为两部分,快速开始教程
快速开始部分演示了框架的安装配置,和如何以最少的代码实现一组API。
教程部分依次介绍了框架组件的概念和用法,将冗长的代码一步步简化成快速开始种的代码形式,并且介绍了每一步的原理。最后会完成一个简单的代码高亮web API。

这里做一下笔记(翻译+心得)

环境:

  • python 2.7.15
  • django 1.11.15
  • djangorestframework 3.8.2

阅读全文

Django 中Field Null和Blank的区别

本文由Scarb发表于金甲虫的博客,转载请注明出处

Django 中模型域(Field)参数 Null和Blank的区别

这两个参数默认为False

阅读全文