django学习记录3)

这一篇将介绍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几个好用的小工具,

哎呀~端午前一天在公司摸鱼沉淀知识可真快落~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值