由於我通過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