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
相关产品推荐
相关产品推荐

