django项目增加脚本,造假数据同步到数据库

  1. --project/
  2. --app/
  3. --scripts/
  4. -fake.py
  5. manage.py
  6. # project/scripts/fake.py
  7. import sys
  8. import os
  9. import django
  10. back = os.path.dirname
  11. BASE_DIR = back(back(os.path.abspath(__file__)))
  12. sys.path.append(BASE_DIR)
  13. ...
  14. if __name__ == '__main__':
  15. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
  16. # 启动django环境
  17. django.setup()
  18. ...

orm group 操作

  1. # orm
  2. from django.db.models import Sum, F
  3. # select pcsmc as key, sum(jls) as value from table where fjmc=:fjmc
  4. # order by sum(jls) desc limit 10
  5. data = Table.objects.filter(fjmc).values(key=F('pcsmc')).annotate(value=Sum('jls')).order_by('-value')[:10]
  • drf post 如何验证csrf
  • 基于类的视图里如何实现自定义方法
  • drf action 是什么

序列化时,控制关联对象输出内容

  1. tags = serializers.SlugRelatedField(
  2. queryset=Tag.objects.all(),
  3. many=True,
  4. required=False,
  5. slug_field='text'
  6. )
  7. """
  8. 通过前面章节已经知道,默认的嵌套序列化器只显示外链的 id
  9. 用 SlugRelatedField 直接显示其 text 字段的内容
  10. """

新增某对象时,希望关联对象不存在就自己创建

  1. """
  2. 多对多关系,DRF 默认你必须先得有这个外键对象,才能指定其关系
  3. DRF执行默认的字段有效性检查比 序列器里 validate、.create()/.update() 都要早
  4. 正确的解法是覆写 to_internal_value() 方法:
  5. """
  6. # serializers.py
  7. class ArticleSerializer(serializers.HyperlinkedModelSerializer):
  8. ...
  9. # 覆写方法,如果输入的标签不存在则创建它
  10. def to_internal_value(self, data):
  11. tags_data = data.get('tags')
  12. if isinstance(tags_data, list):
  13. for text in tags_data:
  14. if not Tag.objects.filter(text=text).exists():
  15. Tag.objects.create(text=text)
  16. return super().to_internal_value(data)

在序列化中增加model里不存在的字段

  1. # serializers.py
  2. class ArticleDetailSerializer(serializers.HyperlinkedModelSerializer):
  3. body_html = serializers.SerializerMethodField()
  4. toc_html = serializers.SerializerMethodField()
  5. def get_body_html(self, obj):
  6. return obj.get_md()[0]
  7. def get_toc_html(self, obj):
  8. return obj.get_md()[1]
  9. class Meta:
  10. model = Article
  11. fields = '__all__'