2012-04-26 170 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%的錯誤時,就意味着它是透明的。