zoukankan      html  css  js  c++  java
  • ORM的查询操作

    1.orm的基本操作

    • 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时。
    • id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定 primary_key=True 即可。如果Django发现你已经明确地设置了Field.primary_key,它将不会添加自动ID列。
    • 本示例中的CREATE TABLE SQL使用PostgreSQL语法进行格式化,但值得注意的是,Django会根据配置文件中指定的数据库后端类型来生成相应的SQL语句。
    • Django支持MySQL5.5及更高版本。

    Django Orm的常用字段和参数

    常用字段

    AutoField

    int自增列,必须填入参数 primary_key=True。当model中如果没有自增列,则自动会创建一个列名为id的列。

    IntegerField

    一个整数类型,范围在 -2147483648 to 2147483647。(一般不用它来存手机号(位数也不够),直接用字符串存,)

    CharField

    字符类型,必须提供max_length参数, max_length表示字符长度。

    这里需要知道的是Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型

    DateField

    日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。

    DateTimeField

    日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。

    null

    用于表示某个字段可以为空。

    unique

    如果设置为unique=True 则该字段在此表中必须是唯一的 。

    db_index

    如果db_index=True 则代表着为此字段设置索引。

    default

    为该字段设置默认值。

    DateField和DateTimeField

    auto_now_add

    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。

    auto_now

    配置上auto_now=True,每次更新数据记录的时候会更新该字段。

    ForeignKey

    外键类型在ORM中用来表示外键关联关系,一般把ForeignKey字段设置在 '一对多'中'多'的一方。

    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。

    字段参数

    to

    设置要关联的表

    to_field

    设置要关联的表的字段

    on_delete

    当删除关联表中的数据时,当前表与其关联的行的行为。

    models.CASCADE

    删除关联数据,与之关联也删除

    db_constraint

    是否在数据库中创建外键约束,默认为True。

    OneToOneField

    一对一字段。

    通常一对一字段用来扩展已有字段。(通俗的说就是一个人的所有信息不是放在一张表里面的,简单的信息一张表,隐私的信息另一张表,之间通过一对一外键关联)

    字段参数0

    to

    设置要关联的表。

    to_field

    设置要关联的字段。

    必知必会的13条

    <1> all查询所有结果

    img

    <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象

    img

    <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

    img

    <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象

    img

    <5> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

    img

    <6> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

    img

    <7> order_by(*field): 对查询结果排序

    <8> reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。

    <9> distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)

    <10> count(): 返回数据库中匹配查询(QuerySet)的对象数量。

    img

    <11> first(): 返回第一条记录

    img

    <12> last(): 返回最后一条记录

    <13> exists(): 如果QuerySet包含数据,就返回True,否则返回False

    13个必会操作总结

    返回QuerySet对象的方法有

    all()

    filter()

    exclude()

    order_by()

    reverse()

    distinct()

    特殊的QuerySet

    values() 返回一个可迭代的字典序列

    values_list() 返回一个可迭代的元祖序列

    返回具体对象的

    get()

    first()

    last()

    返回布尔值的方法有:

    exists()

    返回数字的方法有

    count()1.APIview**使⽤


    djangorestframework使用:https://www.cnblogs.com/xiaonq/p/10124104.html

    DjangoRestFramework使用:https://www.cnblogs.com/xiaonq/p/10987889.html

    • ModelViewSet 是对 APIView 封装
    • ModelSerializer 是对 Serializer

    1.1user/urls.py中添加路由

    urlpatterns = [
         path('apiview/', views.UserInfoViewSet.as_view()),
    ]
    

    1.2 创建user/serializers.py写序列化器

    • serializers.ModelSerializer 和 serializers.Serializer fifield参数说明
    ''' field参数 '''
    # 1.read_only
    read_only=True 表示不允许⽤户⾃⼰上传,只能⽤于api的输出,序列化的时候也不⽤对这个数据进⾏验证,序列化返回是有改字段
    # 2.write_only
    write_only=True 表示在更新或创建实例时可以使⽤该字段,但在序列化返回时不包括该段。
    # 3.required:该字段是必需的,不能为空
    required=True 反序列化(前端返回数据必须包含此字段)的时候必须提供这个字段 设置False 可以不提供
    # 4.allow_null/allow_blank:该字段允许为null/空
    allow_null=True 可以为null 设置False则不能为null
    # 5.label:标签,⽤于对字段显示设置
    # 6.help_text:对字段进⾏解释的⼀段⽂本,⽤于提示
    # 7.style:说明字段的类型
    # 8.error_messages:字段出错时,信息提示
    
    • 创建user/serializers.py写序列化器
    '''
     class User(AbstractUser):
     phone = models.CharField('⼿机号',max_length=20)
     img = models.ImageField(upload_to='user',null=True)
     nick_name = models.CharField('昵称',max_length=20)
     address = models.CharField('地址',max_length=255)
    '''
    
    class UserInfoSerializer(serializers.Serializer):
         id = serializers.CharField(read_only=True) # 普通字段,设置id为只读字段,不能修改
         username =serializers.CharField(min_length=3,max_length=20,error_messages={'required': '该字段必填'}) # 显示普通字段
         img = serializers.ImageField(required=False)
         nick_name = serializers.CharField(max_length=20)
         address = serializers.CharField(max_length=255)
         class Meta:
         	model = User
    
    # 定义创建语法:ser.save()执⾏,就会⽴刻调⽤create⽅法⽤来创建数据
     def create(self, validated_data):
     '''
     validated_data: 表单或者vue请求携带的json:
    {"username":"zhangsan","password":"123456"}
    '''
     # https://www.cnblogs.com/xiaonq/p/7978409.html
     	return User.objects.create(**validated_data)
    
    # 定义更新⽅法
     def update(self, instance, validated_data):
     '''
     instance : 查询的对象
     validated_data : postman提交的json数据
    {"username":"zhangsan","password":"123456"}
     '''
          if validated_data.get('username'):
              instance.username = validated_data['username']
          instance.save()
          return instance
    
    # 定义单⼀字段验证的⽅法
     def validate_username(self, value):
          if value == 'root':
          	raise serializers.ValidationError('不能创建root管理员账号')
          return value
    
     # 定义多字段验证⽅法
     def validate(self, attrs):
          print(attrs)
          if attrs.get("username") == 'admin':
              raise serializers.ValidationError('不能创建admin⽤户')
          return attrs
    

    1.3user/views.py中添加视图函数

    from .models import User
    from .serializers import UserSerializers
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    class UserView(APIView):
        # 查询用户信息
        def get(self, request, *args, **kwargs):
            # ⼀对多、多对多查询都是⼀样的语法
            queryset = User.objects.all()
            ser = UserSerializers(queryset, many=True)  # 多条数据需要many=True
            # ser = UserInfoSerializer(instance=obj[0]) # 关联数据⼀个
            return Response(ser.data)
    
        # 创建用户
        def post(self, request):
            data = request.data
            ser = UserSerializers(data=data)
            try:
                # 判断提交数据是否合法
                ser.is_valid()
                ser.save()  # 保存
                return Response({'code': 200, 'msg': '添加成功'})
            except Exception as e:
                # print(e)
                print(ser.errors)
                return Response({'code': 400, 'msg': '添加失败'})
    
        # 更新⽤户信息
        def put(self, request):
            pk = request.query_params.get('pk')  # 修改数据需要先知道修改那一条数据 
            try:
                userinfo = User.objects.get(id=pk)
            except:
                return Response({'code': 400, 'msg': '用户不存在'})
            # 创建序列化对象,并将要反序列化的数据传递给data构造参数,进而进行验证
            ser = UserSerializers(userinfo, data=request.data)
            if ser.is_valid():
                ser.save()
                return Response({'code': 200, 'msg': '修改成功'})
            return Response({'code': 400, 'errors': ser.errors})
         
         #删除数据
        def delete(self, request):
            pk = request.query_params.get('pk')
            try:
                #删除不需要序列化直接查询后删除
                User.objects.filter(id=pk).delete()
                return Response({'code': 200, 'msg': '删除成功'})
            except:
                return Response({'code': 400, 'msg': '删除失败'})
    

    2.序列化正想反相查询

    https://www.cnblogs.com/xiaonq/p/10987889.html#i3
    

    3.测试接⼝

    3.1 查询所有⽤户

    http://192.168.56.100:8888/user/apiview/
    

    img

    3.2 创建⽤户

    http://192.168.56.100:8888/user/apiview/
    

    img

    3.3 更新⽤户信息

    http://192.168.56.100:8888/user/apiview/?pk=7
    

    img

    3.4 限流功能测试

    http://192.168.56.100:8888/user/apiview/
    '''修改syl/settings.py配置限速设置'''
    REST_FRAMEWORK = {
         #3.1 限流策略
         'DEFAULT_THROTTLE_RATES': {
              'user': '3/hour', # 认证⽤户每⼩时10次
              'anon': '3/day',
         },
    }
    
  • 相关阅读:
    CodeForces 681D Gifts by the List (树上DFS)
    UVa 12342 Tax Calculator (水题,纳税)
    CodeForces 681C Heap Operations (模拟题,优先队列)
    CodeForces 682C Alyona and the Tree (树上DFS)
    CodeForces 682B Alyona and Mex (题意水题)
    CodeForces 682A Alyona and Numbers (水题,数学)
    Virtualizing memory type
    页面跳转
    PHP Misc. 函数
    PHP 5 Math 函数
  • 原文地址:https://www.cnblogs.com/chao460/p/13912677.html
Copyright © 2011-2022 走看看