You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中ORM查询MySQL返回首行,如何获取最新插入行数据?

Django ORM查询最新行数据返回首行的问题解决

问题分析

  1. 查询逻辑冗余且不可靠:你当前为每个字段单独调用values()+latest(),不仅会发起多次数据库查询,还无法保证所有字段都来自同一行最新记录。
  2. created_at时间不符合预期:从你提供的数据库数据来看,ID=1的created_at值13:22:29是所有记录中最晚的,所以latest('created_at')自然会返回该行。如果ID=3是你认为的最新插入记录,说明created_at字段没有正确捕获插入时间。

解决方案

1. 修正查询逻辑(推荐)

不要拆分字段查询,先获取完整的最新记录,再提取所需字段,这样仅需一次数据库查询,结果更可靠:

def success(request):
    # 获取按created_at排序的最新记录
    latest_device = NewDevice.objects.latest('created_at')
    # 提取各字段值
    ip_value = latest_device.ip
    start_time_value = latest_device.start_time
    end_time_value = latest_device.end_time
    # 处理返回逻辑
    return response

2. 确保created_at字段正确工作

你的模型中created_at设置了auto_now_add=True,该参数仅在通过Django ORM创建对象时自动赋值当前时间:

  • 如果是手动向数据库插入数据(比如直接执行SQL语句),需要手动指定created_at的正确时间。
  • 如果通过Django表单/后台插入但时间异常,检查代码中是否存在手动覆盖created_at值的逻辑。

3. 改用主键ID排序(备选)

如果你的业务中最新插入的记录对应最大的ID,可以直接按ID排序获取最新行(适合主键自增的场景):

latest_device = NewDevice.objects.latest('id')

同时建议将主键字段改为自增类型,确保ID随插入顺序递增:

# models.py
class NewDevice(models.Model):
    id = models.BigAutoField(primary_key=True)  # 自增大整数主键
    ip = models.CharField(max_length=150)
    start_time = models.TimeField()
    end_time = models.TimeField()
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "live"

内容的提问来源于stack exchange,提问作者AHSAN YAZDANI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:06:55