Django_字段条件查询 和 跨关系查询

2023-12-03  本文已影响0人  tzktzk1

字段条件查询

字段查询是指如何指定SQL WHERE子句的内容。它们用作QuerySet的filter(), exclude()和get()方法的关键字参数。
其基本格式是:field__lookuptype=value,注意其中是双下划线。
默认查找类型为exact(精确匹配)。
lookuptype的类型有:
Django的数据库API支持20多种查询类型,下表列出了所有的字段查询参数:

字段名         说明
exact       精确匹配
iexact      不区分大小写的精确匹配
contains    包含匹配
icontains   不区分大小写的包含匹配
in          在..之内的匹配
gt          大于
gte         大于等于
lt          小于
lte         小于等于
startswith  从开头匹配
istartswith 不区分大小写从开头匹配
endswith    从结尾处匹配
iendswith   不区分大小写从结尾处匹配
range       范围匹配
date        日期匹配
year        年份
iso_year    以ISO 8601标准确定的年份
month       月份
day         日期
week        第几周
week_day    周几
iso_week_day 以ISO 8601标准确定的星期几
quarter     季度
time        时间
hour        小时
minute      分钟
second      秒
regex       区分大小写的正则匹配
iregex      不区分大小写的正则匹配

案例:

#字段条件查询
class TestFieldQuery(TestCase):
    def setUp(self) -> None:
        req1 = Request.objects.create(method=1,url='/mgr/course/',data={"name":"小明","age":16,"address":"nanjing"})
        req2 = Request.objects.create(method=1,url='/mgr/teacher/',data={"name":"小刚","age":18,"address":"beijing"})
        req3 = Request.objects.create(method=1,url='/mgr/course/',data={"name":"小明","age":16,"address":"nanjing"})

    def test_iquery(self):
        req = Request.objects.all().first()
        print(req)
        # 测试修改--整体
        print('************************************')
        # 字段条件查询的语法是:字段__条件名
        print(Request.objects.filter(url__iexact='/MGR/course/'))
        # 包含模式
        print(Request.objects.filter(url__contains='course/'))

    def test_in_query(self):
        #
        print(Request.objects.filter(url__in=['/mgr/course/']))

执行测试

python manage.py test sqtp.tests.TestFieldQuery

跨关系查询

Django提供了强大并且直观的方式解决跨越关联的查询,它在后台自动执行包含JOIN的SQL语句。要跨越某个关联,只需使用关联的模型字段名称,并使用双下划线分隔,直至你想要的字段(可以链式跨越,无限跨度).
例如
查找标签是xxx的用例

res1=Case.objects.filter(tags__name='smoketest')

案例:

#跨关系查询
class TestOverRelations(TestCase):
    def setUp(self) -> None:
        # 创建用例
        config1 = Config.objects.create(name='case001',base_url='http://localhost')
        config2 = Config.objects.create(name='case002',base_url='http://localhost')
        self.case1 = Case.objects.create(config=config1)
        self.case2 = Case.objects.create(config=config2)

    def test_step_request(self):
        # 准备测试数据 步骤和请求
        step1 = Step.objects.create(belong_case=self.case1,name='step1')
        step2= Step.objects.create(belong_case=self.case1,name='step2')
        step3 = Step.objects.create(belong_case=self.case2,name='step3')
        step4 = Step.objects.create(belong_case=self.case2,name='step4')

        req1 = Request.objects.create(method=1,url='/mgr/teacher1/',data={"name":"小刚","age":18,"address":"beijing"},step=step1)
        req2 = Request.objects.create(method=2,url='/mgr/teacher2/',data={"name":"小刚","age":18,"address":"beijing"},step=step2)
        req3 = Request.objects.create(method=3,url='/mgr/teacher3/',data={"name":"小刚","age":18,"address":"beijing"},step=step3)
        req4 = Request.objects.create(method=1,url='/mgr/teacher4/',data={"name":"小刚","age":18,"address":"beijing"},step=step4)

        print(req1.step.belong_case) #链式语法
        # 跨关系查询的语法: 字段__关联字段
        # print(Request.objects.filter(step__belong_case=self.case2))
        print(Request.objects.filter(step__belong_case__config__name='case001').filter(url__contains='teacher2'))

执行测试

python manage.py test sqtp.tests.TestOverRelations
上一篇 下一篇

猜你喜欢

热点阅读