使用自定义ID字段保存Django继承模型时的IntegrityError

时间:2014-09-23 15:29:39

标签: django django-models

使用自定义主键保存模型时遇到错误 - id字段。

我的模特:

class TestZ(models.Model):
    id = models.CharField(primary_key=True, max_length=7)
    field0 = models.CharField(max_length=10)
    class Meta:
        abstract = True

class TestX(TestZ):
    field1 = models.CharField(max_length=10)

class TestA(TestX):
    field2 = models.CharField(max_length=10)

class TestB(TestX):
    pass

错误:

>>> TestB.objects.create(pk='aa', field0='0', field1='1')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 157, in create
    return self.get_queryset().create(**kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 322, in create
    obj.save(force_insert=True, using=self.db)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 545, in save
    force_update=force_update, update_fields=update_fields)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 573, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 654, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 687, in _do_insert
    using=using, raw=raw)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 232, in _insert
    return insert_query(self.model, objs, fields, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 1514, in insert_query
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py", line 903, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 69, in execute
    return super(CursorDebugWrapper, self).execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/utils.py", line 99, in __exit__
    six.reraise(dj_exc_type, dj_exc_value, traceback)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 53, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py", line 451, in execute
    return Database.Cursor.execute(self, query, params)
IntegrityError: NOT NULL constraint failed: myapp_testb.testx_ptr_id

pk中没有自定义TestZ字段,我可以保存对象。 从管理页面我可以添加一个对象,没有错误。

Django==1.6.5

1 个答案:

答案 0 :(得分:0)

创建模型对象时需要引用自定义id字段。我测试了它,它的工作原理 - &gt; TestB.objects.create( id ='aa',field0 ='0',field1 ='1')