2013-04-07 43 views
0

我在与增加现有模型的客户的新副本,它看起来像烦恼:IntegrityError在非现有字段

class Client(models.Model): 
    user = models.OneToOneField(User) # Extending default user model 
    organization = models.CharField(max_length=40) 
    def __unicode__(self): 
     return self.user.first_name + " " + self.user.last_name 

林进入外壳并键入此:

from django.contrib.auth.models import User 
from mysiteApp.models import Client 

user = User.objects.get(pk=2) # User with pk 2 exists 
client = Client(user=user, organization="someorg") # copy creates succesfully 

但随后,即时通讯试图通过 client.save()

保存副本,并即时得到这样的:

>>> client.save() 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 537, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 641, in save_base 
    result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 215, in _insert 
    return insert_query(self.model, objs, fields, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 1559, 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 844, in execute_sql 
    cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/util.py", line 41, in execute 
    return self.cursor.execute(sql, params) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py", line 389, in execute 
    six.reraise(utils.IntegrityError, utils.IntegrityError(*tuple(e.args)), sys.exc_info()[2]) 
    File "/usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.py", line 387, in execute 
    return Database.Cursor.execute(self, query, params) 
IntegrityError: mysiteApp_client.cID may not be NULL 

的事情是,我在客户端模型之前,有这样的字段作为CID,至极真的有NOT NULL,但现在我不

manage.py SQL mysiteApp显示:

BEGIN; 
CREATE TABLE "mysiteApp_client" (
    "id" integer NOT NULL PRIMARY KEY, 
    "user_id" integer NOT NULL UNIQUE REFERENCES "auth_user" ("id"), 
    "organization" varchar(40) NOT NULL 
) 
; 

manage.py syncdb没有改变,我该怎么办? 谢谢。

回答

3

您的数据库仍处于需要cID字段的状态。这是因为syncdb不会改变已经存在的表。

为了解决你的问题,你有三种选择:

一)删除该客户端表(=丢失数据)在数据库中,然后再次运行syncdb

b)使用SQL ALTER TABLE手动修改数据库命令

c)使用类似Southintroduction)的迁移工具来反映您为数据库中的models.py所做的更改。我会建议学习如何处理南方,因为一旦你在生产中,你可能需要这样的移植工具。

+0

删除和重新创建表解决了这个问题,非常感谢。 – edikwow 2013-04-07 14:17:18