QuerySet过滤器获取None列值,但实际上不是None

时间:2019-04-10 08:39:41

标签: python-2.7 django-models

我在mysql中有一条数据,该数据有一个名为create_time的列,其值是0000-00-00 00:00:00.000000。我在Navicat中检查。 表格模型:

class Meta:
        db_table = 'region_info'

    region_id = models.CharField(max_length=32, unique=True, help_text=u"region id")
    region_name = models.CharField(max_length=32, unique=True, help_text=u"数据中心名称")
    region_alias = models.CharField(max_length=32, help_text=u"数据中心别名")
    datacenter_env = models.CharField(max_length=20, help_text=u"数据中心所属环境", default='production')
    url = models.CharField(max_length=256, help_text=u"数据中心API url")
    wsurl = models.CharField(max_length=256, help_text=u"数据中心Websocket url")
    httpdomain = models.CharField(max_length=256, help_text=u"数据中心http应用访问根域名")
    tcpdomain = models.CharField(max_length=256, help_text=u"数据中心tcp应用访问根域名")
    token = models.CharField(max_length=40, null=True, blank=True, default="", help_text=u"数据中心token")
    status = models.CharField(max_length=2, help_text=u"数据中心状态 0:编辑中 1:启用 2:停用 3:维护中")
    create_time = models.DateTimeField(default=datetime.now, help_text=u"创建时间")
    desc = models.CharField(max_length=128, blank=True, help_text=u"数据中心描述")
    scope = models.CharField(max_length=10, default="private", help_text=u"数据中心范围 private|public")
    ssl_ca_cert = models.TextField(blank=True, null=True, help_text=u"数据中心访问ca证书地址")
    cert_file = models.TextField(blank=True, null=True, help_text=u"验证文件")
    key_file = models.TextField(blank=True, null=True, help_text=u"验证的key")

当我使用RegionConfig.objects.filter获取数据时,我发现属性create_time为None,就像这样:

>>> region = RegionConfig.objects.filter(region_name="rainbond")
>>> print len(region)
1
>>> r = region[0]
>>> print r.datacenter_env
test
>>> print r.create_time   
None

我想知道为什么不选择。

1 个答案:

答案 0 :(得分:0)

有两个选项可以帮助您解决此问题

  • auto_now_add-第一次创建对象时自动将字段设置为现在
  • auto_now-每次保存对象时自动将字段设置为现在

因此,您可以像这样在模型中使用它们;

class RegionConfig(models.Model):
    create_time = models.DateTimeField(auto_now_add=True)
    modified_time = models.DateTimeField(auto_now=True)

需要注意的是,它们不会显示在admin中,因为它们变成了只读字段,因此在admin类中,您需要定义;

readonly_fields=('create_time', 'modified_time')

readonly_fields的文档