Django相关用法

request.GET.get()用法

Django request.GET 对象及其相关使用方法 | 极客教程 (geek-docs.com)

request.GET获取的是包含所有通过GET请求传递给服务器的参数的字典对象(也就是?后面的参数列表)。注意这里是字典对象,那么相应的,便可以使用get()方法根据键值获取相应的属性值,即request.GET.get('key')

列表生成式

列表生成式 - Python 教程 - 廖雪峰的官方网站 (liaoxuefeng.com)

列表生成式可以用来便捷创建list数组。如生成`[1×1, 2×2, ..., 9×9]的列表时,可以仅使用一行代码完成:

1
x * x for x in range(1, 11)

此外for循环后面还可以加上if进行判断,以完成更高阶的操作,比如只需要计算偶数的平方时:

1
x * x for x in range(1, 11) if x % 2 == 0

需要注意for后面的if语句不能带else,因为for后面的if是个筛选条件,不然就无法进行筛选了(带了else不就是全条件了?)

1
x for x in range(1, 11) if x % 2 == 0 else 0	# 错误写法

如果把if写在for前面需要加else,否则也会报错。

1
x if x % 2 == 0 for x in range(1, 11)	# 这样写会报错

因为for前面的部分是一个表达式,必须要计算出一个结果。如果只是x if x % 2 == 0是无法根据x计算出结果的,因为缺少了else

1
x if x % 2 == 0 else 0 for x in range(1, 11)

因此,在一个列表生成式中,for前面的if...else是表达式,而for后面的if是过滤条件,不能带else

Django的Cast()函数

Python Django Cast 用法及代码示例 - 纯净天空 (vimsky.com)

声明

1
class Cast(expression, output_field)

强制将expression的结果类型转换为来自output_field的结果类型。即类型转换。

示例:

1
2
3
author = Author.objects.anotate(
age_as_float = Cast('age', output_field=FloatField()),
).get()

这里把原来为非float类型的age强制转换为float类型。

:=运算符

python - Python 中的冒号等于(:=)是什么意思?_Stack Overflow 中文网

:=其实就是赋值运算符。

Django序列化组件Django REST Framework

Django 序列化组件 Serializers 详解 - 种树飞 - 博客园 (cnblogs.com)

序列化器 - Django REST 框架 (django-rest-framework.org)

django 框架之序列化反序列化_django json 反序列化为 model-CSDN 博客

序列化组件可以把复杂的数据类型(查询集或模型实例)转换为 Python 数据类型,同时该组件还提供反序列化功能。最主要的用途是把实例对象序列化为 Json 格式的数据或者把 Json 格式的数据反序列化为实例对象。

声明序列化程序

在使用序列化之前需要声明序列化器,该序列化器可以序列化或反序列化与对象相应的数据,声明序列化器和声明类是很相似的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 声明 Comment 类
class Comment:
def __init__(self, email, content, created=None):
self.email = email
self.content = content
self.created = created or datetime.now()

comment = Comment(email='leila@example.com', content='foo bar')


# 声明 CommentSerializer 序列化器
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()

序列化对象

相当于使用对象实例的内容新建一个与之对应的序列化器实例

1
2
3
somment_serializer = CommentSerializer(comment)
serializer.data
# {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}

这时已经转换为 Python 原生的数据类型了。接下来就是常用的把数据渲染为 .json 格式:

1
2
3
4
5
from rest_framework.renderers import JSONRenderer

json = JSONRenderer().render(serializer.data)
json
# b'{"email":"leila@example.com","content":"foo bar","created":"2016-01-27T15:17:10.375877"}'

反序列化对象

反序列化分为两步:

  1. 数据校验
  2. 数据保存

需要先把 Python 原生数据类型流解析,这里使用的是io.BytesIO(),解析完之后再使用JSONParser().parse()将其转化为 JSON 格式的数据:

1
2
3
4
5
import io
from rest_framework.parsers import JSONParser

stream = io.BytesIO(json)
data = JSONParser().parse(stream)

然后通过is_valid()进行数据校验,返回True之后便可通过validated_data获取数据了。

1
2
3
4
5
serializer = CommentSerializer(data=data)
serializer.is_valid()
# True
serializer.validated_data
# {'content': 'foo bar', 'email': 'leila@example.com', 'created': datetime.datetime(2012, 08, 22, 16, 20, 09, 822243)}

保存数据

在调用序列化器的save()方法时,需要手动创建create()update()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
class CommentSerializer(serializers.Serializer):
email = serializers.EmailField()
content = serializers.CharField(max_length=200)
created = serializers.DateTimeField()

def create(self, validated_data):
return Comment(**validated_data)

def update(self, instance, validated_data):
instance.email = validated_data.get('email', instance.email)
instance.content = validated_data.get('content', instance.content)
instance.created = validated_data.get('created', instance.created)
return instance

当有了create()方法,在创建序列化对象时便可以通过partial=True来允许部分字段更新。

创建新数据

当创建序列化对象时只传入 data 数据即创建新数据,自动调用create()方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
...

def create(self, validated_data):
"""新建"""
return BookInfo.objects.create(**validated_data)

# 测试
from db.serializers import BookInfoSerializer
data = {'btitle': '封神演义'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid() # True
serializer.save() # <BookInfo: 封神演义>

更新数据

当创建序列化对象时传入实例 instance 对象和 data 数据时即更新数据,传入两个数据系统会自动调用update()方法。instance 为要更新的对象实例,validated_data 为更新数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class BookInfoSerializer(serializers.Serializer):
"""图书数据序列化器"""
...

def create(self, validated_data):
"""新建"""
return BookInfo.objects.create(**validated_data)

def update(self, instance, validated_data):
"""更新,instance为要更新的对象实例"""
instance.btitle = validated_data.get('btitle', instance.btitle)
instance.bpub_date = validated_data.get('bpub_date', instance.bpub_date)
instance.bread = validated_data.get('bread', instance.bread)
instance.bcomment = validated_data.get('bcomment', instance.bcomment)
instance.save() #注意需要保存数据
return instance

Class Meta的功能

Django 中的 class Meta 知识点 - CSDN 博客

简单来讲,class Meta 作为嵌套类给上级类添加一些功能或者指定一些标准

1
2
3
4
5
6
7
class Main(models.Model):
img = models.CharField(max_length=200) # 图片
name = models.CharField(max_length=100) # 名称
trackid = models.CharField(max_length=16) # 通用id

class Meta:
abstract = True #抽象类

比如上面的这个,把 Main 类定义为抽象类,方便其他类进行继承,这个类也不必生产数据库表单。

1
2
3
4
class MainWheel(Main):
# 轮播banner
class Meta:
db_table = 'axf_wheel'

上面的 db_table 指定了 MainWheel 对应的数据库表。

1
2
3
4
5
6
7
8
9
10
11
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.CharField(max_length=50)
website = models.URLField()

class Meta:
ordering = ['order_date']
# 按订单升序排列

上面的 ordering 表示按照指定的字段进行数据库的排序,目的是让结果便于查找并且美观一些。

os.path 模块

Python os.path 模块 | 菜鸟教程 (runoob.com)

os.path 模块主要用于获取文件的属性。

方法 说明
os.path.abspath(path) 返回绝对路径
os.path.basename(path) 返回文件名
os.path.commonprefix(list) 返回 list (多个路径) 中,所有 path 共有的最长的路径
os.path.dirname(path) 返回文件路径
os.path.exists(path) 如果路径 path 存在,返回 True;如果路径 path 不存在或损坏,返回 False。
os.path.lexists(path) 路径存在则返回 True,路径损坏也返回 True
os.path.expanduser(path) 把 path 中包含的 ~~user 转换成用户目录
os.path.expandvars(path) 根据环境变量的值替换 path 中包含的 \(name** 和 **\){name}
os.path.getatime(path) 返回最近访问时间(浮点型秒数)
os.path.getmtime(path) 返回最近文件修改时间
os.path.getctime(path) 返回文件 path 创建时间
os.path.getsize(path) 返回文件大小,如果文件不存在就返回错误
os.path.isabs(path) 判断是否为绝对路径
os.path.isfile(path) 判断路径是否为文件
os.path.isdir(path) 判断路径是否为目录
os.path.islink(path) 判断路径是否为链接
os.path.ismount(path) 判断路径是否为挂载点
os.path.join(path1[, path2[, ...]]) 把目录和文件名合成一个路径
os.path.normcase(path) 转换 path 的大小写和斜杠
os.path.normpath(path) 规范 path 字符串形式
os.path.realpath(path) 返回 path 的真实路径
os.path.relpath(path[, start]) 从 start 开始计算相对路径
os.path.samefile(path1, path2) 判断目录或文件是否相同
os.path.sameopenfile(fp1, fp2) 判断 fp1 和 fp2 是否指向同一文件
os.path.samestat(stat1, stat2) 判断 stat tuple stat1 和 stat2 是否指向同一个文件
os.path.split(path) 把路径分割成 dirname 和 basename,返回一个元组
os.path.splitdrive(path) 一般用在 windows 下,返回驱动器名和路径组成的元组
os.path.splitext(path) 分割路径,返回路径名和文件扩展名的元组
os.path.splitunc(path) 把路径分割为加载点与文件
os.path.walk(path, visit, arg) 遍历 path,进入每个目录都调用 visit 函数,visit 函数必须有 3 个参数 (arg, dirname, names),dirname 表示当前目录的目录名,names 代表当前目录下的所有文件名,args 则为 walk 的第三个参数
os.path.supports_unicode_filenames 设置是否支持 unicode 路径名

json.load() 函数

python 的 json.load () 函数 - 知乎 (zhihu.com)

json.load() 函数读取文件,可以直接读取这个文件的所有内容,并且读取的结果返回为 python 的字典对象。

request.body

返回请求的主体(Json对象)


Django相关用法
https://excelius.xyz/django相关用法/
作者
Ther
发布于
2024年8月28日
许可协议