django项目增加脚本,造假数据同步到数据库
--project/
--app/
--scripts/
-fake.py
manage.py
# project/scripts/fake.py
import sys
import os
import django
back = os.path.dirname
BASE_DIR = back(back(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
...
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
# 启动django环境
django.setup()
...
orm group 操作
# orm
from django.db.models import Sum, F
# select pcsmc as key, sum(jls) as value from table where fjmc=:fjmc
# order by sum(jls) desc limit 10
data = Table.objects.filter(fjmc).values(key=F('pcsmc')).annotate(value=Sum('jls')).order_by('-value')[:10]
- drf post 如何验证csrf
- 基于类的视图里如何实现自定义方法
- drf action 是什么
序列化时,控制关联对象输出内容
tags = serializers.SlugRelatedField(
queryset=Tag.objects.all(),
many=True,
required=False,
slug_field='text'
)
"""
通过前面章节已经知道,默认的嵌套序列化器只显示外链的 id
用 SlugRelatedField 直接显示其 text 字段的内容
"""
新增某对象时,希望关联对象不存在就自己创建
"""
多对多关系,DRF 默认你必须先得有这个外键对象,才能指定其关系
DRF执行默认的字段有效性检查比 序列器里 validate、.create()/.update() 都要早
正确的解法是覆写 to_internal_value() 方法:
"""
# serializers.py
class ArticleSerializer(serializers.HyperlinkedModelSerializer):
...
# 覆写方法,如果输入的标签不存在则创建它
def to_internal_value(self, data):
tags_data = data.get('tags')
if isinstance(tags_data, list):
for text in tags_data:
if not Tag.objects.filter(text=text).exists():
Tag.objects.create(text=text)
return super().to_internal_value(data)
在序列化中增加model里不存在的字段
# serializers.py
class ArticleDetailSerializer(serializers.HyperlinkedModelSerializer):
body_html = serializers.SerializerMethodField()
toc_html = serializers.SerializerMethodField()
def get_body_html(self, obj):
return obj.get_md()[0]
def get_toc_html(self, obj):
return obj.get_md()[1]
class Meta:
model = Article
fields = '__all__'