Django后端开发学习笔记:记录一些小问题

Posted 梆子井欢喜坨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django后端开发学习笔记:记录一些小问题相关的知识,希望对你有一定的参考价值。

常见问题参考

这里记录下以后可能会用上的东西

【1】Shell脚本启动django 的runserver

【2】Django rest framework自定义返回数据格式

【3】django restframework 实现单个和群体增删改查

【4】Django REST Framework中把DatetimeField转换为时间戳

【5】Django的ORM中如何判断查询结果是否为空,判断django中的orm为空

【6】Django–自定义Serializer序列化字段,动态改变field参数

零散知识点

1. DRF获取参数的方式

# 例如url
# url(r'^demo/(?P<word>.*)/$', DemoView.as_view())
# 在类视图中获取参数
# url:http://127.0.0.1:8000/demo/aaa/?bbb=bbb&ccc=ccc&ccc=CCC
# form:"body":"body"
# JSON:"body":"body"
class DemoView(APIView):

    def post(self, request, aaa):
        aaa = aaa  # 获取url路径中的参数
        bbb_str = request.query_params.get('bbb')  # 获取一个查询字符串的参数
        ccc_list = request.query_params.getlist('ccc')  # 获取多个查询字符串参数
        # 请求体中的参数
        # 如果通过form表单传递,获取出来是QueryDict,通过.dict()转换成python的字典
        form_body = request.data
        # 如果通过JSON传递,获取出来就是字典,例如'body':'body'
        # json_body = request.data
        print(aaa)
        print(bbb_str)
        print(ccc_list)
        print(form_body.dict())
        # print(json_body)
        return Response('message': 'OK')

结果

aaa
bbb
['ccc', 'CCC']
'body': 'body'
URL路径参数/查询字符串不区分请求方式,GET/POST/PUT等都一样
serializer中获取参数
# view
class DemoView(GenericAPIView):
    serializer_class = DemoSerializer

    def post(self, request, aaa):
        serializer = self.get_serializer(data=request.query_params)
        serializer.is_valid(raise_exception=True)
        return Response('message': 'OK')

# serializer
class DemoSerializer(serializers.Serializer):
    bbb = serializers.CharField()
    ccc = serializers.ListField()  # List

    def validate(self, attrs):
        aaa = self.context['view'].kwargs.get('aaa')  # 获取路径参数
        bbb = attrs['bbb']  # 获取查询字符串
        ccc = attrs['ccc']  # 获取以多个key相同的查询字符串
        # 获取当前登陆的对象,需要根据场景进行使用
        # user = self.context['request'].user
        print(aaa)
        print(bbb)
        print(ccc)
        return attrs

2. DateTimeField

 created = models.DateTimeField(auto_now_add=True)
  • auto_now=Ture,字段保存时会自动保存当前时间,但要注意每次对其实例执行save()的时候都会将当前时间保存,也就是不能再手动给它存非当前时间的值。
  • auto_now_add=True,字段在实例第一次保存的时候会保存当前时间,不管你在这里是否对其赋值。但是之后的save()是可以手动赋值的。也就是新实例化一个model,想手动存其他时间,就需要对该实例save()之后赋值然后再save()。

3. DRF中的action

1.作用:将ViewSet方法标记为可路由操作。@action装饰器函数将被赋予“mapping”属性,可用于添加其他基于方法的行为的“方法映射器”。

2.@action(methods=None, detail=None, url_path=None, url_name=None, **kwargs)

  • methods:此操作响应的HTTP方法名称的列表。默认为“get”。
  • detail:必需。确定此操作是否适用于实例/细节请求或集合/列表请求。 url_path:定义此操作的url段。默认为装饰的方法的名称。
  • url_name:定义此操作的内部(reverse)url名称。默认为用下划线修饰的方法的名称替换为破折号。
  • kwargs:要在视图上设置的其他属性。这个可以用重写viewset level*\\u
  • classes设置,相当于“@renderer_classes”等修饰符如何为函数工作-基于API视图。
from rest_framework.decorators import action

@action(methods=['get'], detail=False)
def get_user_list(self, request):
    return Response(res, status=status.HTTP_200_OK)

@action(methods=['get'], detail=True)
 def get_user_detail(self, request, pk):
     return Response(data, status=status.HTTP_200_OK)

3.访问路由
xxx/get_user_list
xxx/pk/get_user_detail

以上是关于Django后端开发学习笔记:记录一些小问题的主要内容,如果未能解决你的问题,请参考以下文章

Django后端开发学习笔记:记录一些小问题

Django后端开发学习笔记:记录一些小问题

Django后端开发学习笔记Django基本概念

Django后端开发学习笔记Django基本概念

Django后端开发学习笔记Django REST Framework入门

Django后端开发学习笔记Django REST Framework入门