由于我通过https://docs.djangoproject.com/en/1.4/topics/db/models/工作,在Django,我已经开始了一个名为myapp
新的应用程序和编辑的models.py
文件作为演练定义:Django的models.py没有领域
class Person(models.Model):
GENDER_CHOICES = (
(u'M', u'Male'),
(u'F', u'Female')
)
name = models.CharField(max_length=60)
gender = models.CharField(max_length=2, choices=GENDER_CHOICES)
然后我跑manage.py syncdb
,并试图运行在manage.py shell
交互提示
>>> p = Person(name="Fred Flintstone", gender="M")
>>> p.save()
Traceback (most recent call last):
.…[I removed a few lines]...
DatabaseError: table myapp_person has no column named name
>>> p.gender
u'M'
>>> p.get_gender_display()
u'Male'
接下来的几行......所以后来我检查,看看是否有sqlite3的名为人的名称列的数据库对象
C:\Users\djangoSite>python manage.py sql myapp
BEGIN;
CREATE TABLE "myapp_person" (
"id" integer NOT NULL PRIMARY KEY,
"name" varchar(60) NOT NULL,
"gender" varchar(2) NOT NULL
);
当然它!所以Person模型存在,但是它没有得到我在models.py中设计的字段?我做了一个dir(Person)
来电,它确认名称和性别字段不在那里......其次,我做了dir(p)
,它确实有它们。我想这是因为我们只是将它们添加到该元组中,所以这并不意外。
最大的问题是然后:
- 我为什么不能 'p.save()'?
- 为什么导入电话不会带有我在
models.py
中设计的字段的对象? - 这是设计吗?
- 我只是做错了吗?
改为使用Person.objects.create()。应该可以工作。 – mossplix 2012-04-26 21:54:26
在做了一些更多的研究之后,我在django文档中发现了这个似乎解释问题的小宝石:Syncdb不会改变现有表格syncdb只会为尚未安装的模型创建表格。它永远不会发出ALTER TABLE语句来匹配安装后对模型类所做的更改。对模型类和数据库模式的更改往往涉及某种形式的模糊性,在这些情况下,Django必须猜测正确的更改。在这个过程中,关键数据可能会丢失。正如你所说删除数据库 – 2012-04-27 03:58:16