即使数据库将 0 存储为字段值,Django 查询集对象也返回 None 而不是 0

Posted

技术标签:

【中文标题】即使数据库将 0 存储为字段值,Django 查询集对象也返回 None 而不是 0【英文标题】:Django queryset objects return None instead of 0 even though the database has 0 stored as the field value 【发布时间】:2019-01-25 23:53:01 【问题描述】:

当我开始在我的 Django 项目中使用 mysql-connector/python 而不是 mysqlclient 时遇到了一个问题。在结果查询集中,数据库中存储为 0 的值突然变为“无”,这是一个示例。

queryset = Invoices.objects.all().filter(sold=0)
print(queryset[0].sold)  # Prints "None"

同样的语句用 mysqlclient 会打印 0。

有什么好的方法可以解决这个问题吗?我还没有让 mysqlclient 与我当前的设置很好地配合,我宁愿不必根据 0 值跟踪所有调用并对其进行重组以处理 Nonetypes。

使用相关模型进行编辑:

from django.db import models
from authentication.models import Account, SubUser


class Invoices(models.Model):
    rating = models.CharField(max_length=5, null=True)
    serial = models.CharField(max_length=60, null=False)
    amount = models.CharField(max_length=60, null=False)
    debtor = models.CharField(max_length=128, null=False)
    debtorname = models.CharField(max_length=128, null=False)
    seller = models.ForeignKey(Account, on_delete=models.DO_NOTHING, related_name='soldinvoices', null=False)
    dateout = models.CharField(max_length=256, null=False)
    expiration = models.CharField(max_length=256, null=False)
    buyer = models.ForeignKey(Account, on_delete=models.DO_NOTHING, related_name='boughtinvoices', null=True)
    fid = models.CharField(max_length=256, null=False)
    filepath = models.CharField(max_length=256, null=False)
    approved = models.IntegerField(default=0)
    paid = models.IntegerField(default=0)
    sold = models.IntegerField(default=0)
    date = models.DateTimeField(auto_now_add=True, null=False)
    subseller = models.ForeignKey(SubUser, null=True, on_delete=models.DO_NOTHING)
    askingprice = models.CharField(max_length=100, null=True)

Sold、Paid 和 Approved 都返回为 None,即使它们可以使用 0 作为值进行查询。

补充例子:

my_foo = Foo(bar=0)
my_foo.save()
print(my_foo.bar)  # prints 0

使用 mysql-connector-python 的单独查询会在查询集中产生预期的 0。

Django 版本 2.0.3.0,mysql-connector-python 版本 8.0.12。

【问题讨论】:

你能分享你的模型吗? @WillemVanOnsem 已将其添加到帖子中! 这里好像没有status 字段。你确定这不是 attribute (Django 方面的一些逻辑)? @WillemVanOnsem 这只是一个例子,应该更清楚一点,将使用实际查询编辑帖子! 您可以在您的问题中添加 django 和 mysql-connector 的版本号吗? 【参考方案1】:

如果有人仍然遇到这个问题(就像我一样),我找到了一个适合我的解决方案。在settings.py文件的数据库配置中,添加如下选项:

'OPTIONS': 'use_pure': True 

这为我解决了问题。 希望这会有所帮助。

【讨论】:

【参考方案2】:

将空参数传递给所有这些字段。

【讨论】:

你是什么意思,sold = models.IntegerField(default=0, null=False)?该字段的值不为空,为0。单独使用mysql查询数据库时,该值确实存储为0

以上是关于即使数据库将 0 存储为字段值,Django 查询集对象也返回 None 而不是 0的主要内容,如果未能解决你的问题,请参考以下文章

具有浮点形式输入的 django 整数模型字段

Django 模型字段可调用默认值不起作用

使用 Django reduce(or_) - 如何将结果为 0 的不匹配查询存储在变量中

将 Django 查询集中的所有值相加

oracle将查询的结果值作为下一个查询的字段列。

Django 使用某些字段的最新值注释查询集