0

我在添加现有模型客户端的新副本时遇到了麻烦,如下所示:

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

我进入 shell 并输入:

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 之类的字段,它确实没有为空,但现在我没有

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 没有任何改变,我该怎么办?谢谢。

4

1 回答 1

3

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

为了克服您的问题,您有三个选择:

a)删除数据库中的客户端表(=丢失您的数据)并syncdb再次运行

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

c) 使用South ( introduction ) 之类的迁移工具来反映您对数据库中的 models.py 所做的更改。我建议学习如何处理 South,因为一旦您投入生产,您可能需要这样的迁移工具。

于 2013-04-07T12:51:49.173 回答