
文章目录
import json
import logging
import os
from datetime import datetime
from django.conf import settings
from django.db.models import Q, F
from rest_framework import status, filters, mixins, generics, viewsets, permissions
from rest_framework.decorators import action
from rest_framework.response import Response
from configures.models import Configures
from envs.models import Envs
from interfaces.models import Interfaces
from projects.serializers import ProjectsSerializer, ProjectsNamesSerializer, ProjectsInterfacesSerializer, \
ProjectsRunSerializer, ProjectsNames1Serializer
from testcases.models import Testcases
from testsuites.models import Testsuits
from utils import common
logger=logging.getLogger('mytest')
from projects.models import Projects
from utils.pagination import PageNumberPagination
class ProjectsViewSet(viewsets.ModelViewSet):
queryset=Projects.objects.all()
serializer_class = ProjectsSerializer
pagination_class = PageNumberPagination
def get_serializer_class(self):
elif self.action=='names1':
return ProjectsNames1Serializer
else:
return super().get_serializer_class()
def paginate_queryset(self, queryset):
if self.action == 'names1':
return
else:
return super().paginate_queryset(queryset)
def get_queryset(self):
if self.action=='names1':
else:
return super().get_queryset()
get():获取模型对象
如果获取不到,将报错
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.get(id=1))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:自动化测试平台项目
Projects.objects.all():获取查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.all())
return Projects.objects.all()
else:
return super().get_queryset()
查询结果:
<QuerySet [<Projects: 自动化测试平台项目>, <Projects: 前程贷P2P金融项目>, <Projects: 项目4>, <Projects: 项目5>, <Projects: 项目6>, …]>
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__gte=5))
return Projects.objects.all()
else:
return super().get_queryset()
<QuerySet [<Projects: 项目4>, <Projects: 项目5>, <Projects: 项目6>, <Projects: 2022-5-21-2项目>, <Projects: 2022-5-21-3项目>, …]>
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.exclude(id__range=[2,5]))
return Projects.objects.all()
else:
return super().get_queryset()
通过order_by 方法, 前面加"-"就是降序,默认升序
Projects.objects.order_by(‘id’):升序
Projects.objects.order_by(‘-id’):降序
可以多次排序 先按name字段降序,如果name相同,就按id字段升序
Projects.objects.order_by(“-name”,“id”)
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.order_by('id'))
print(Projects.objects.order_by('id'))
return Projects.objects.all()
else:
return super().get_queryset()
Projects.objects.all().first():返回模型对象,查找第一个对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.all().first())
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:模型对象
自动化测试平台项目
Projects.objects.all().last():返回模型对象,查找最后一个对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.all().last())
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:模型对象
2022_8_7_31项目
Projects.objects.filter(id__gte=3).exists():exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__gte=3).exists())
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:True
统计查询集中模型对象的数量,返回的是数字
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__gte=3).count())
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:49
同列表操作一致,返回查询集对象
limit 通过索引进行切片[10:20] 代表从10取到20 前闭后开
查询集不支持负数索引:Projects.objects.filter()[-1]
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.all()[2:4])
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:
<QuerySet [<Projects: 项目4>, <Projects: 项目5>]>
Projects.objects.values(“name”,“tester”)
返回查询集对象,列表中套字典,只取"name","tester"字段
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.values("name","tester"))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:
<QuerySet [{‘name’: ‘自动化测试平台项目’, ‘tester’: ‘优优’}, {‘name’: ‘前程贷P2P金融项目’, ‘tester’: ‘小可可’}, {‘name’: ‘项目4’, ‘tester’: ‘某人’}, {‘name’: ‘项目5’, ‘tester’: ‘某人’}, {‘name’: ‘项目6’, ‘tester’: ‘某人’},…]>
Projects.objects.values_list(“name”,“tester”)
返回查询集对象,列表中套元组,只取"name","tester"字段
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.values_list("name","tester"))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:
<QuerySet [(‘自动化测试平台项目’, ‘优优’), (‘前程贷P2P金融项目’, ‘小可可’), (‘项目4’, ‘某人’), (‘项目5’, ‘某人’), (‘项目6’, ‘某人’), (‘2022-5-21-2项目’, ‘kobe11’), (‘2022-5-21-3项目’, ‘qweq’), (‘2022-5-21-4项目’, ‘12311’), …]>>
where name like “获取%” 代表查询名字以获取开头的所有
name__istartswith 表示不区分大小写,以什么什么为开头
Projects.objects.filter(name__startswith=‘获取’):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(name__startswith='获取'))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:<QuerySet [<Projects: 获取总部城市>]>
where name like “%4” 表示匹配以4结尾的所有单词
name__iendswith 表示不区分大小写,以什么什么为结尾
Projects.objects.filter(name__endswith=‘4’):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(name__endswith='4'))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:<QuerySet [<Projects: 项目4>]>
where name like “%自动化%” 表示匹配中间有 自动化 字的所有单词
name__icontains 表示不区分大小写,包含什么什么的单词
Projects.objects.filter(name__contains=‘自动化’):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(name__contains='自动化'))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:<QuerySet [<Projects: 自动化测试平台项目>]>
通过 字段名__in = [1,2] 查询
Projects.objects.filter(id__in=[1,2,3,4,5,6]):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__in=[1,2,3,4,5,6]))
return Projects.objects.all()
else:
return super().get_queryset()
Projects.objects.exclude(id__in=[1,2,3,4,5,6]):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.exclude(id__in=[1,2,3,4,5,6]))
return Projects.objects.all()
else:
return super().get_queryset()
between … and… 通过 列名__range = [开始位置,结束位置] 闭区间
Projects.objects.filter(id__range=[2,5]):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__range=[2,5]))
return Projects.objects.all()
else:
return super().get_queryset()
Projects.objects.exclude(id__range=[2,5]):返回查询集对象
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.exclude(id__range=[2,5]))
return Projects.objects.all()
else:
return super().get_queryset()
Projects.objects.filter(name__exact=‘自动化测试平台项目’):返回查询集对象
iexact:不区分大小写
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(name__exact='自动化测试平台项目'))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:<QuerySet [<Projects: 自动化测试平台项目>]>
需要导入:from django.db.models import F
Projects.objects.filter(id__gte=F(‘name’))
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__gte=F('name')))
return Projects.objects.all()
else:
return super().get_queryset()
需要导入:from django.db.models import Q
Projects.objects.filter(Q(id__gte=5) | Q(name__contains=“2022”))
| 表示 或
& 表示 与
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(Q(id__gte=5) | Q(name__contains="2022")))
return Projects.objects.all()
else:
return super().get_queryset()
需要导入:from django.db.models import Count,Max,Min,Sum
如果你想要对数据集先进行分组然后再进行某些聚合操作或排序时,需要使用annotate方法来实现。与aggregate方法不同的是,annotate方法返回结果的不仅仅是含有统计结果的一个字典,而是包含有新增统计字段的查询集(queryset).
print(Projects.objects.values(“name”).annotate(Count(“id”))):表示对name字段进行分组,分组后对id进行统计
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.values("leader").annotate(Count("id")))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:
<QuerySet [{‘leader’: ‘可可’, ‘id__count’: 1}, {‘leader’: ‘可优’, ‘id__count’: 1}, {‘leader’: ‘某人’, ‘id__count’: 1}, {‘leader’: ‘某人’, ‘id__count’: 1}, {‘leader’: ‘某人’, ‘id__count’: 1}, {‘leader’: ‘kobe11’, ‘id__count’: 1}, …]>
先查询项目编号大于等于5
接着以id、name、tester进行分组
分组后按照tester进行统计
def get_queryset(self):
if self.action=='names1':
querys=Projects.objects.filter(id__gte=5).values('id','name','tester').annotate(Count("tester"))
print(querys)
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:
<QuerySet [{‘id’: 11, ‘name’: ‘项目4’, ‘tester’: ‘某人’, ‘tester__count’: 1}, {‘id’: 12, ‘name’: ‘项目5’, ‘tester’: ‘某人’, ‘tester__count’: 1}, {‘id’: 13, ‘name’: ‘项目6’, ‘tester’: ‘某人’, ‘tester__count’: 1}, …']>
aggregate的中文意思是聚合, 源于SQL的聚合函数。Django的aggregate()方法作用是对一组值(比如queryset的某个字段)进行统计计算,并以字典(Dict)格式返回统计计算结果。django的aggregate方法支持的聚合操作有AVG / COUNT / MAX / MIN /SUM 等。
需要导入:from django.db.models import Count,Max,Min,Sum
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.aggregate(Count("id")))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:{‘tester__count’: 49}
其他结果为:
{‘tester__sum’: 49}
{‘tester__max’: 49}
{‘tester__min’: 49}
{‘tester__avg’: 49}
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.aggregate(Count("tester"),Max('tester'),Min('tester'),Avg('tester'),Sum('tester')))
return Projects.objects.all()
else:
return super().get_queryset()
执行结果:
{‘tester__count’: 49, ‘tester__max’: ‘小姐姐’, ‘tester__min’: ‘12311’, ‘tester__avg’: 2763.9591836734694, ‘tester__sum’: 135434.0}
def get_queryset(self):
if self.action=='names1':
print(Projects.objects.filter(id__gt=1))
print(Projects.objects.filter(id__gte=1))
print(Projects.objects.filter(id__lt=5))
print(Projects.objects.filter(id__lte=5))
return Projects.objects.all()
else:
return super().get_queryset()
p=Projects.objects.only(“tester”,“name”)
查询tester和name字段不会走数据库,走的是查询集
查询其他字段,会重新走数据库查询;
而p=Projects.objects.all()就不用走数据库查询了
def get_queryset(self):
if self.action=='names3':
p=Projects.objects.only("tester","name")
print(p)
return Projects.objects.only("tester","name")
else:
return super().get_queryset()
执行的sql语句为:

p=Projects.objects.defer(“tester”,“name”)
defer括号内放的字段不在查询出来的对象里面,查询该字段需要重新走数据
而如果查询的是非括号内的字段 则不需要走数据库了
def get_queryset(self):
if self.action=='names3':
p=Projects.objects.defer("tester","name")
print(p)
return Projects.objects.defer("tester","name")
else:
return super().get_queryset()
执行的sql语句为:
SELECT “tb_projects”.“id”, “tb_projects”.“create_time”, “tb_projects”.“update_time”, “tb_projects”.“is_delete”, “tb_projects”.“leader”, “tb_projects”.“programmer”, “tb_projects”.“publish_app”, “tb_projects”.“desc” FROM “tb_projects” ORDER BY “tb_projects”.“id” ASC



我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我在Rails上使用带有ruby的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s
我正在为锦标赛开发一个Rails应用程序。我在这个查询中使用了三个模型:classPlayertruehas_and_belongs_to_many:tournamentsclassTournament:destroyclassPlayerMatch"Player",:foreign_key=>"player_one"belongs_to:player_two,:class_name=>"Player",:foreign_key=>"player_two"在tournaments_controller的显示操作中,我调用以下查询:Tournament.where(:id=>params
我想用sunspot重现以下原始solr查询q=exact_term_text:fooORterm_textv:foo*ORalternate_text:bar*但我无法通过标准的太阳黑子界面理解这是否可能以及如何实现,因为看起来:fulltext方法似乎不接受多个文本/搜索字段参数我不知道将什么参数作为第一个参数传递给fulltext,就好像我通过了"foo"或"bar"结果不匹配如果我传递一个空参数,我得到一个q=*:*范围过滤器(例如with(:term).starting_with('foo*')(顾名思义)作为过滤器查询应用,因此不参与评分。似乎可以手动编写字符串(或者可能使
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果
我目前正在尝试了解RoR。我将两个字符串传递到我的Controller中。一个是随机的十六进制字符串,另一个是电子邮件。该项目用于对数据库进行简单的电子邮件验证。我遇到的问题是当我输入如下内容来测试我的页面时:http://signup.testsite.local/confirm/da2fdbb49cf32c6848b0aba0f80fb78c/bob.villa@gmailcom我在:email的参数散列中得到的全部是'bob'。我在gmail和com之间留下了.,因为那样会导致匹配根本不起作用。我的路由匹配如下:match"confirm/:code/:email"=>"conf