首页 > 解决方案 > QuerySet 过滤器获取无列值,但表面上它不是无

问题描述

我在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 是无,就像:

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

我想知道为什么它没有。

标签: python-2.7django-models

解决方案


有几个选项可以帮助您解决这个问题

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

所以你会像这样在你的模型上使用它们;

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

需要注意的是,它们不会出现在管理员中,因为它们成为只读字段,因此在管理员类中,您需要定义;

readonly_fields=('create_time', 'modified_time')

文档readonly_fields


推荐阅读