这一篇将介绍django的orm操作(主要涉及数据的增删改查语句),数据结构和表的定义在上一篇:dango学习记录2)
我的model是task ,简单定义一下model
class task(Model):
class Meta:
pass
STATUS_TYPE = (
(0, '待运行'),
(1, '运行中'),
(2, '已完成'),
(3, '任务中止')
)
status = models.IntegerField(choices=STATUS_TYPE, default=0)
user = models.ForeignKey(get_user_model(), models.CASCADE, to_field='username', db_column='uid')
time = models.DateTimeField(auto_now=True)
查
获取task表的所有数据: 返回的数据是QuerySet<>
task.objects.all()
根据条件获取某一条记录,返回的数据是task对象,使用get最好加上捕获异常,因为记录不存在会崩:
try:
task.objects.get(id=5)
except Exceptions as e:
print("not found")
根据条件获取列表,并按照条件排序,,没有符合条件的会返回空列表:
task.objects.filter(status=1).order_by('time')
根据条件获取列表,并按照条件排序 ,取第一个.first()或者最后一个.last():
task.objects.filter(status=1).order_by('time').first()
task.objects.filter(status=1).order_by('time').last()
filter中可以加多个条件 ,以及Q语法,要注意Q语法中是两个下划线 status__in,
task.objects.filter(status=1,stid=2).order_by('time')
from django.db.models import Q
task.objects.filter(Q(status__lt=3) | Q(status=4)).order_by('-time')
status_list = [1,2,3,4]
task.objects.filter(Q(status__in=status_list)).order_by('-time')
start="2021-06-09 19:22:18"
end = "2021-06-09 19:23:01"
task.objects.filter(Q(time__range=(start, end)))
关于Q语法,我是参考这位总结的博客,够用了https://blog.csdn.net/qq_35959613/article/details/81132034
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
Q的筛选条件还可以包含外键,本例中task model关联外键user ,在get_user_model中 有字段username,就可以根据这个作为筛查条件:
task.objects.filter(Q(user__username="yunzhi"))
Q条件之间可以进行与或非运算:
- 与: &
- 或: |
- 非:~ 一个小波浪
task.objects.filter(~Q(user__username="yunzhi"))
获取符合条件的记录个数:
task.objects.filter(status=4).count()
获取记录并去重:
task.objects.filter(Q(time__range=(start, end))).distinct()
获取执行的sql语句,这个在调试的时候还挺实用的,可以检查复杂Q语法是否正确:
task.objects.filter(status=4).query
增
在 viewset中如果重写了create方法,可直接调用父类的create进行创建:
class TaskViewSet(ReadCreateUpdateModelViewSet):
serializer_class = TaskSerializer
pagination_class = JSONPagination
def create(self, request, *args, **kwargs):
data = request.data
data['user'] = request.user
data['status'] = 0
request._full_data = data
res = super().create(request, *args, **kwargs)
return res
在APIView中 可通过 以下方法进行创建
- create
- get_or_create (根据条件查找,如果没查找到,就调用create创建)
- update_or_create(试图更新,如果没有就创建)
task.objects.create(user="yunzhi",status=1)
task.objects.get_or_create(user="yunzhi",status=1)
task.objects.update_or_create(user="yunzhi",status=1)
改
在 viewset中如果重写了update方法,可直接调用父类的update进行更新:
class TaskViewSet(ReadCreateUpdateModelViewSet):
serializer_class = TaskSerializer
pagination_class = JSONPagination
def update(self, request, *args, **kwargs):
data = request.data
status = data.get('status', None)
if status < 0 or status > 3:
raise exceptions.NotAcceptable('Task status error')
request._full_data = data
res = super().update(request, *args, **kwargs)
return res
在APIView中 可通过 以下方法进行更新,区别是update是将符合条件的记录进行批量更新,而第三种方法是针对具体的对象进行更新
- update
- update_or_create(试图更新,如果没有就创建)
- 先通过get方法获取,修改后使用save()
task.objects.filter(uid__username="yunzhi").update(status=1)
task.objects.update_or_create(user="yunzhi",status=1)
try:
my_task = SubmitTask.objects.get(id=5)
except:
raise exceptions.NotAcceptable('Task status error')
my_task.status = 3
my_task.save()
删
delete同update,根据条件批量删除记录。
task.objects.filter(uid=9).delete()
下一篇介绍关于我认为的django几个好用的小工具,
哎呀~端午前一天在公司摸鱼沉淀知识可真快落~