在Django中保存模型给了我"警告:字段'id'没有默认值"

Ton*_*ony 6 python mysql django

我在Django中有一个非常基本的模型:

class Case(models.Model):
    name = models.CharField(max_length=255)
    created_at = models.DateTimeField(default=datetime.now)
    updated_at = models.DateTimeField(default=datetime.now)

    def save(self):
        if self.created_at == None:
             self.created_at = datetime.now()
        self.updated_at = datetime.now()
        super(Case, self).save()

    class Meta:
        db_table = u'cases'
Run Code Online (Sandbox Code Playgroud)

因为我没有指定PK,Django为我照顾了这个.我在我的数据库中看到了一个名为"id"的字段,标记为主键并自动增加.我觉得奇怪的是得到了警告,因为数据库和模型端的一切都很酷.错误是:

_mysql_exceptions.Warning

Warning: Field 'id' doesn't have a default value
Run Code Online (Sandbox Code Playgroud)

保存时我的工作是将id设置为0.它会终止警告并且无论如何都会正确设置id,因为MySQL处理它.

case = Case()
case.id = 0 #ugly workaround for - Warning: Field 'id' doesn't have a default value
case.name = request.POST[u'case[name]']
case.save()
Run Code Online (Sandbox Code Playgroud)

此解决方案的问题是:

  1. 它很丑
  2. 保存后无法访问新PK,这使得无法正确序列化

有谁知道如何解决这一问题?

我在跑:

Python 2.7.2
django.VERSION (1, 3, 1, 'final', 0)
mysql  Ver 14.14 Distrib 5.1.45, for apple-darwin10.2.0 (i386) using readline 5.1
MySQL_python-1.2.3-py2.7-macosx-10.4-x86_64.egg
Run Code Online (Sandbox Code Playgroud)

我的create table看起来像这样:

CREATE TABLE `cases` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=45 DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

Aea*_*Aea 13

我想在本周讨论这个问题时扩展这个问题.我得到了同样的错误,看看模型定义和SQL定义表明:

  1. 受影响的模型要么没有明确定义的PK,要么明确定义了PK(两者都有问题).仅此一点似乎无关紧要.

  2. 受影响的表具有OP中的"id"定义,即id int(11) NOT NULL AUTO_INCREMENT.该PRIMARY KEY预期设定.

  3. 查看MySQL查询日志,我得到了这样的程度:

    INSERT INTO `x` (...) VALUES (...)
    SHOW WARNINGS
    ROLLBACK
    
    Run Code Online (Sandbox Code Playgroud)

    单独运行查询是成功的,并SHOW WARNINGS反映了OP中记录的警告.

然而,我遇到了一个MySQL端修复,http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/提到重置id定义(粗略地看一下没有任何不同)修复问题.我无法解释为什么这样可行,但它解决了这个问题而没有任何额外的代码更改.我相信这可能在某种程度上与删除记录有关,但整个问题对我来说似乎并不敏感.

  • +1谢谢,就像OP我想知道如果表格def在mysql中是正确的,为什么会出现错误,但这澄清了它,mysql中的一个错误有任何一个归档的票? (2认同)
  • 在使用MySQL迁移列到Autofield之后,我使用Django/South遇到了这个问题.显然这个警告是迁移的副作用,你建议的MySQL-end修复解决了这个问题.这里有一张南票可以获得更多信息:http://south.aeracode.org/ticket/1160 (2认同)

Lyc*_*cha 5

你有机会重建数据库吗?似乎它可能有问题.

作为旁注:如果您已将默认字段设置datetime.now()为,created_at则无需调用datetime.now.