【问题标题】:Django does assign but not store primary key valueDjango 确实分配但不存储主键值
【发布时间】:2013-03-15 10:50:03
【问题描述】:

我有一个简单的 django 模型

class Directory(models.Model):

  id = models.AutoField(primary_key=True)
  path = models.TextField(unique=True)

  def __unicode__(self):
    return self.path

  class Meta:
    db_table = u'directories'

但是,将 Directory 实例保存到 db 中似乎存在一些问题

>>> from cygapp.models import Directory
>>> d = Directory()
>>> d.path = '/usr'
>>> d.id
>>> d.save()
>>> d.id
4
>>> d
<Directory: /usr>

虽然正确分配了 ID 字段(下一个空闲值),但它并未存储在 db 中

sqlite> select * from directories;
1|/bin
2|/system/lib
3|/system/bin
|/usr

我在这里错过了什么?

【问题讨论】:

  • django 会自动为您的模型分配一个 id 字段,您不需要手动声明它。另外,尝试删除您的 unicode 方法,看看它是否会打印您的 id

标签: django model sqlite


【解决方案1】:

您为保存记录所做的一切都是正确的,应该分配一个自动 ID。

删除您的自定义 id 字段 id = models.AutoField(primary_key=True),因为 Django 会自动为您执行此操作。然后删除您的“目录”表并运行python manage.py syncdb。这将确保您的模型上有正确的 id 字段。

【讨论】:

  • 我知道 django 会自动创建一个 id,但由于我必须将我的模型适应现有的数据库,我想自己控制一切,我也不能简单地运行 syncdb,因为我想要django_*auth_* 表存储在单独的数据库中。但是删除表并从manage.py 生成的sql 重新创建它解决了这个问题(为什么)。因此,我将其标记为正确答案。谢谢:-)
  • 您使用的是 multi_db 部署 (docs.djangoproject.com/en/dev/topics/db/multi-db) 吗?这应该允许您使用 syncdb 机制并将您的用户数据存储在单独的数据库中。
  • 事实上,我愿意。我还没有做的是实现allow_syncdb。我会马上解决的。再次感谢!
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多