ORM查询方法(整理)

ORM的常用查询方法

app01/models.py


from django.db import models



# 扮演角色
class Role(models.Model):
    # 角色名称
    role_name = models.CharField(max_length=32, unique=True)

    class Meta:
        db_table = "xc_role"


# 班级信息
class Classroom(models.Model):
    # 班级名称
    class_name = models.CharField(max_length=32, verbose_name="班级名称", unique=True)
    # 班级地址
    address = models.CharField(max_length=32, null=True)

    class Meta:
        db_table = "xc_class"

    def __str__(self):
        return self.class_name


# 用户名称
class User(models.Model):
    # 用户名称
    username = models.CharField(max_length=32, verbose_name="姓名")
    # 用户年龄
    age = models.IntegerField(verbose_name="年龄")
    # 用户地址
    home = models.CharField(verbose_name="家乡", null=True, max_length=32)
    # 用户身高
    hight = models.IntegerField(verbose_name="身高", null=True)

    # 多对多
    roles = models.ManyToManyField(Role)

    # 一对多
    classrooms = models.ForeignKey(Classroom, on_delete=models.CASCADE, null=True)

    class Meta:
        db_table = "xc_user"


迁移命令

# 生成迁移文件
python manage.py makemigrations
# 迁移数据库
python manage.py migrate

app01/serializer.py

from app01.models import *
from rest_framework import serializers


class UserSer(serializers.ModelSerializer):
    class Meta:
        model = User

        fields = "__all__"
        # depth = 1


class ClassSer(serializers.ModelSerializer):
    class Meta:
        model = Classroom

        fields = "__all__"
        # depth = 1


class RoleSer(serializers.ModelSerializer):
    class Meta:
        model = Role

        fields = "__all__"
        # depth = 1

app01/urls.py

from django.urls import path
from app01.views import *

urlpatterns = [

    path('info/', InfoView.as_view()),
    
    path('manytomany/', ManytoManyTest.as_view()),

]

app01/views.py

# 导入相应的模块
from django.db.models import F, Q, Sum
from app01.models import *
from rest_framework.views import APIView
from rest_framework.response import Response
from app01.serializer import *


class InfoView(APIView):
    def get(self, request):

        # 基本查询 ============================

        # 单个查询,不存在抛出异常
        # user = User.objects.get(username="tim")
        # ser = UserSer(user)
        # return Response(ser.data)

        # 查询多个值,有说多少返回多少
        # user = User.objects.all()  # all不可以接参数,否则会报错
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # 查询结果的数量
        # user = User.objects.filter(age=19).count()
        # return Response(user)

        # 查询结果取反
        # user = User.objects.exclude(username="tim")
        # print(user)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # 模糊查询 ======================

        # contains 是否包含 查询结果包含某个值
        # user = User.objects.filter(home__contains="北京")
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # startswith/endswith 以指定值开头/结尾
        # user = User.objects.filter(home__startswith="上")
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # ==========================
        # user = User.objects.filter(home__endswith="平")
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # 空查询 =====================

        # isnull 是否为空
        # user = User.objects.filter(home__isnull=False)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # 范围查询 =========================

        # in 在范围内
        # user = User.objects.filter(id__in=[1, 3, 5])
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # range 相当于detween...and...
        # user = User.objects.filter(id__range=[3, 6])
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # 比较查询 =========================

        # gt  大于    >
        # 查询id⼤于5的
        # user = User.objects.filter(id__gt=5)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # gte   大/等于    >=
        # 查询id⼤于等于5的
        # user = User.objects.filter(id__gte=5)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # lt    小于  <
        # 查询id小于3的
        # user = User.objects.filter(id__lt=3)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # lte   小/等于    <=
        # 查询id小于等于3的
        # user = User.objects.filter(id__lte=3)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # exclude   不等于 !=
        # 查询id不等于的5的
        # user = User.objects.exclude(id=5)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

        # F对象和Q对象 =====================

        # 比较两个字段之间的关系用F对象(F可以进行运算)
        # user = User.objects.filter(age__gte=F('hight'))
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # =============================================
        # (F可以进行运算)
        # user = User.objects.filter(age__gte=F('hight')*2)
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # 与逻辑运算符连⽤使⽤Q对象。 或( | ) 与( & )  ⾮( ~ )
        # 查询年龄为19或者id为3的对象
        # user = User.objects.filter(Q(age__gte=19) | Q(pk__lt=3))
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # -查询年龄为19与&id为3的对象--------------------------------
        # user = User.objects.filter(Q(age__gte=19) & Q(pk__lt=3))
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # -查询年龄为非~20的对象-------------------------------------
        # user = User.objects.filter(~Q(age__gte=20))
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # 聚合函数 ========================================================
        # 使⽤aggregate()过滤器调⽤聚合函数。
        # 聚合函数包括:Avg平均,Count数量,Max最⼤,Min最⼩,Sum求和

        # user = User.objects.aggregate(Sum('age'))  # 求库中所有年龄的和
        # print(user)
        # return Response(user)

        # 排序
        # 使⽤order_by对结果进⾏排序
        # user = User.objects.all().order_by('age')  # 按库中的年龄的升序排列
        # ser = UserSer(user, many=True)
        # return Response(ser.data)
        # ============================================================
        # user = User.objects.all().order_by('-age')  # 按库中的年龄的降序排列
        # ser = UserSer(user, many=True)
        # return Response(ser.data)

		pass

manytomany的操作

app01/views.py

from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from app01.models import *
from app01.serializer import *


class ManytoManyTest(APIView):

    # 增加方法
    def post(self, request):

        # 方法一: 建立在manytomany的models里添加数据(一条,一个对象)
        user_obj = User.objects.filter(id=1).first()
        role_obj = Role.objects.filter(id=2).first()
        data = user_obj.roles.add(role_obj)
        return Response({
            "code": 1000,
            "data": data
        })
        # ⽅法⼆:在未建⽴manytomany的models⾥添加数据,(⼀条,⼀个对象)
        # user_obj = User.objects.all()
        # role_obj = Role.objects.filter(id=2).first()
        # role_obj.user_set.add(*user_obj)
        # return Response({
        #     "code": 1000,
        # })
        pass

    # 删除方法
    def delete(self, request):
        # ⽅法⼀:在建⽴manytomany的models⾥删除数据,(⼀条,⼀个对象)
        user_obj = User.objects.filter(id=5).first()
        role_obj = Role.objects.filter(id=3).first()
        user_obj.roles.remove(role_obj)
        return Response({
            "code": 1000
        })
        # ⽅法⼆:在未建⽴manytomany的models⾥删除数据,(多条,可迭代对象)
        # user_obj = User.objects.all()
        # role_obj = Role.objects.filter(id=2).first()
        # role_obj.user_set.remove(*user_obj)
        # return Response({
        #     "code": 1000
        # })
        pass

    # 修改数据
    def put(self, request):

        # ⽅法⼀:在建⽴manytomany的models⾥修改数据,参数只能是可迭代对象
        user_obj = User.objects.filter(id=1).first()
        role_obj = Role.objects.filter(id=3)
        user_obj.roles.set(role_obj)
        return Response({
            "code": 1000
        })
        # ⽅法⼆:在未建⽴manytomany的models⾥修改数据,参数只能是可迭代对象
        # user_obj = User.objects.all()
        # role_obj = Role.objects.filter(id=1).first()
        # role_obj.user_set.set(user_obj)
        # return Response({
        #     "code": 1000,
        # })
        pass

    # 查看数据
    def get(self, request):

        # ⽅法⼀:在建⽴manytomany的models⾥查数据
        user_obj = User.objects.get(id=2)
        data = user_obj.roles.all()
        data_list = []
        for item in data:
            data_dic = {
                "role_name": item.role_name,
                "username": user_obj.username
            }
            data_list.append(data_dic)
        return Response(data_list)

        # ⽅法⼆:在未建⽴manytomany的models⾥查数据
        # role_obj = Role.objects.get(id=2)
        # data = role_obj.user_set.all()
        # data_list = []
        # for item in data:
        #     data_dic = {
        #         "role_name": role_obj.role_name,
        #         "username": item.username
        #     }
        #     data_list.append(data_dic)
        # return Response(data_list)

        pass

原文地址:https://www.cnblogs.com/chao460/p/14036558.html