2012-04-26 171 views
0
进口

由于我通过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),它确实有它们。我想这是因为我们只是将它们添加到该元组中,所以这并不意外。

最大的问题是然后:

  1. 我为什么不能 'p.save()'?
  2. 为什么导入电话不会带有我在models.py中设计的字段的对象?
  3. 这是设计吗?
  4. 我只是做错了吗?
+0

改为使用Person.objects.create()。应该可以工作。 – mossplix 2012-04-26 21:54:26

+0

在做了一些更多的研究之后,我在django文档中发现了这个似乎解释问题的小宝石:Syncdb不会改变现有表格syncdb只会为尚未安装的模型创建表格。它永远不会发出ALTER TABLE语句来匹配安装后对模型类所做的更改。对模型类和数据库模式的更改往往涉及某种形式的模糊性,在这些情况下,Django必须猜测正确的更改。在这个过程中,关键数据可能会丢失。正如你所说删除数据库 – 2012-04-27 03:58:16

回答

1

为什么我不能p.save()

您的人员表中没有列名。 manage.py sql myapp只显示了django根据你的模型生成的sql。不是sqlite中的实际表。 (当然它应该匹配)重要的是你输入你的sqlite数据库并确定表和它的模式。我发现在开发SyncDB并稍后对模型进行更改时。重新同步数据库不会修改表。您必须删除表,然后重新同步或更改表。

为什么导入调用不会带有我在models.py中设计的字段的对象?

请修改您的问题以反映这个问题,它不会看起来像访问或实例化一个人对象有任何问题。

这是设计吗?

不,我不认为这是通过设计,我相信这些是常见的问题,因为新用户正在学习新的框架。在我学习的过程中,我遇到了几个星期和几个月的各种问题,他们将会越来越远。只要确保你正在验证事情正常工作。检查manage.py sql myapp是不相关的。检查数据库以查看schem更具相关性。 Django是一个成熟的平台,当它给你99.9%的错误时,就意味着它是透明的。