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

Django ORM查询报错:Truncated incorrect DOUBLE value问题求助

问题根源与解决方案

让我们一步步拆解你的问题:

为什么会出现Double类型转换警告?

核心问题出在模型定义与数据库实际结构不匹配:

  • 你的ProductPositions模型中,product_code被定义为ForeignKey(Products),Django默认会关联Products的主键id(整数类型)。
  • 但数据库里的Product_Positions表中,product_code字段存储的是字符串(比如A_17、A_16),对应Products表的code字段,而非整数类型的id。

当你执行ProductPositions.objects.filter(product_code__code=product_code)时,Django生成的SQL会尝试把数据库中product_code列的字符串值,和Products表的id(整数)做关联匹配,MySQL在处理这种跨类型比较时,会强制把字符串转换成数值类型——像A_15这种非数字字符串自然无法转换,就触发了Truncated incorrect DOUBLE value警告。

如何解决?

1. 修正模型定义

修改ProductPositions的product_code字段,明确指定关联到Products的code字段(而非默认的id):

class ProductPositions(models.Model):
    product_code = models.ForeignKey(
        Products,
        db_column='product_code',
        null=False,
        to_field='code',  # 关联到Products的code字段
        on_delete=models.CASCADE,  # Django 2.0+必须指定on_delete
    )
    product_no = models.DecimalField(unique=True, max_digits=12, decimal_places=1, primary_key=True)
    product_title = models.CharField(max_length=255)
    product_description = models.TextField()

    def __str__(self):
        return self.product_description

    class Meta:
        db_table = 'Product_Positions'
        unique_together = ('product_code', 'product_no')

注意:Products的code字段已经设置了unique=True,满足作为外键关联字段的要求。

2. 修正查询逻辑

模型修正后,你可以用更简洁且正确的方式查询:

# 方式1:先获取Products对象,再关联查询
product = Products.objects.get(id=data['product_id'])
positions = ProductPositions.objects.filter(product_code=product)

# 方式2:直接通过code过滤
product_code = Products.objects.get(id=data['product_id']).code
positions = ProductPositions.objects.filter(product_code__code=product_code)

3. 关于connection.queries为空的问题

Django的QuerySet是惰性求值的——只有当你实际使用QuerySet(比如print()、遍历、调用exists())时,才会执行SQL并发送到数据库。你之前查看connection.queries时还没触发查询,所以为空。可以在print(positions)之后再查看,就能看到生成的SQL了。

4. 实现最终目标

要获取指定product_code和product_no的product_description,推荐用get()(确保唯一结果)并处理不存在的情况:

try:
    target_position = ProductPositions.objects.get(
        product_code__code=product_code,
        product_no=data['product_no']
    )
    description = target_position.product_description
except ProductPositions.DoesNotExist:
    # 处理记录不存在的场景
    description = "No description found"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:45:53