python case when用法_Django ORM使用Case和When条件表达式

问题

有这么一个需求,需要根据订单的创建时间和更新时间排序,要按照最后的操作时间进行排序。

比如,在26分创建了一个订单a,在27分创建了一个订单b,然后在28分修改订单a,又在29分创建了订单c,那么此时订单的排序结果,应该是c,a,b。

表中数据(时间是示例,实际是datetime.datetime类型):

ID

订单号

创建时间

更新时间

1

a

26

28

2

b

27

3

c

29

方案

一开始的想法是根据更新时间排序,然后更新时间为空的,按照创建时间排序。但是这种方式对于没有更新时间的数据,筛选出来会出现排序混乱的问题。

后来想到可以将两个字段合成一个字段,这样就可以对这个字段排序了,但是也有问题,合成一个字段,会出现数据重复,而且也不好筛选和过滤。

在网上搜了搜,看到可以使用SQL的条件表达式,case,when,then。

实现

SQL使用条件表达式,可以判断update_time是否为空,如果有值,则使用自己的值,如果没有值则使用create_time,并且可以对结果使用别名,然后根据这个别名来进行排序。这样排序的时候就会同时根据更新时间和创建时间来排序。

代码示例

完整代码示例:

from django.db.models import Case, DateTimeField, F, When

# 查询所有的数据,只要queryset是Django查询集即可

queryset = Order.objects.all()

#

queryset.annotate(

op_time=Case(

When(update_time=F("update_time"), then=F("update_time"),),

default=F("create_time"),

output_field=DateTimeField(),

),

).order_by("-op_time")

完整的SQL示例:

SELECT

id,

create_time,

update_time,

(

CASE update_time

WHEN update_time THEN

update_time

ELSE

create_time

END) AS t

FROM

courtesy_car_order

ORDER BY

t DESC

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用Django快速搭建博客系统,可以按照以下步骤进行: 1. 安装Django 首先需要安装Django,可以使用pip命令进行安装: ``` pip install django ``` 2. 创建Django项目和应用 使用以下命令创建一个Django项目和一个应用: ``` django-admin startproject myblog cd myblog python manage.py startapp blog ``` 这里的myblog是项目名称,blog是应用名称。 3. 配置数据库 在myblog/settings.py文件中配置数据库信息,这里使用SQLite数据库: ```python DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } ``` 4. 创建博客模型 在blog/models.py文件中定义博客的模型: ```python from django.db import models class Blog(models.Model): title = models.CharField(max_length=100) content = models.TextField() pub_date = models.DateTimeField(auto_now_add=True) ``` 这里定义了一个博客模型,包括标题、内容和发布时间。 5. 创建数据库表 使用以下命令创建数据库表: ``` python manage.py makemigrations python manage.py migrate ``` 6. 创建视图 在blog/views.py文件中定义博客列表视图和详情视图: ```python from django.shortcuts import render, get_object_or_404 from .models import Blog def blog_list(request): blogs = Blog.objects.all() return render(request, 'blog_list.html', {'blogs': blogs}) def blog_detail(request, pk): blog = get_object_or_404(Blog, pk=pk) return render(request, 'blog_detail.html', {'blog': blog}) ``` 这里定义了博客列表视图和详情视图,通过模板渲染展示博客信息。 7. 创建模板 在blog/templates目录下创建博客列表和详情的模板: blog_list.html: ```html {% for blog in blogs %} <h2><a href="{% url 'blog_detail' blog.pk %}">{{ blog.title }}</a></h2> <p>{{ blog.content }}</p> <p>{{ blog.pub_date }}</p> {% endfor %} ``` blog_detail.html: ```html <h2>{{ blog.title }}</h2> <p>{{ blog.content }}</p> <p>{{ blog.pub_date }}</p> ``` 8. 配置URL 在myblog/urls.py文件中配置博客列表和详情的URL: ```python from django.urls import path from blog.views import blog_list, blog_detail urlpatterns = [ path('', blog_list, name='blog_list'), path('<int:pk>/', blog_detail, name='blog_detail'), ] ``` 9. 运行Django项目 使用以下命令运行Django项目: ``` python manage.py runserver ``` 然后在浏览器中访问http://127.0.0.1:8000/就可以看到博客列表页面了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值