2014-09-23 57 views
0

使用自定義主鍵保存模型時出現錯誤 - id字段。使用自定義ID字段保存Django繼承模型時的IntegrityError

我的模型:

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 

沒有定製pkTestZ我可以保存的對象。 從管理頁面我可以添加一個對象,沒有錯誤。

Django==1.6.5

+0

如果使用'id'創建對象,會發生什麼?而不是'pk'? – 2014-09-23 17:11:11

回答

0

您需要在創建模型對象時,引用自定義id字段。我測試了這一點,它的工作原理 - > TestB.objects.create(id ='aa',field0 ='0',field1 ='1')