2013-08-16 45 views
2

我在創建和保存(插入到數據庫)模型實例時遇到了與Django文檔不一致的非常奇怪的行爲。我已經用盡了可能的原因,並會非常感謝任何建議爲什麼Django無法在這些情況下保存所有字段創建並保存非空Django模型實例作爲子類實例的一部分

該類我使用:

class Person(models.Model): 
    user = models.ForeignKey(User) 
    phone_number = models.CharField(max_length=20, blank=True) 
    address  = models.CharField(max_length=200, blank=True) 

及這裏的簡化版,工作,少數情況下的代碼:在任何情況下的Django上official Django docs

# First Case 
new_person = Person() 
new_person.user = request.user 
new_person.phone_number = '111111' 
new_person.save(force_insert=True) 

# Second One 
new_person = Person(user=request.user, phone_number='111111') 
new_person.save(force_insert=True) 

# Third One 
new_person = Person.objects.create(user=request.user, phone_number='111111') 

基礎應該創建一個對象,然後將其插入進入DB。

事實上,該對象已成功創建(並設置了所有相關字段),但插入到DB中的行只有iduser_id字段填充正確,而phone_number字段也設置爲空。

但是,訪問和更新現有(保存的早期)對象的所有字段沒有問題。

Person中刪除blank=True類聲明(通過適當的表更改)不會改變任何內容。

編輯: 問題原來是更復雜。完整的描述和解決方案在我自己的答案下面

+0

第三個應該是'Person.objects.create'而不是'Person.objects.Create' - 小寫'c' – karthikr

+0

當您刪除'blank = True'時,它是對數據庫表結構的更改。 Django默認不會識別這個。您必須刪除數據庫並使用syncdb(痛苦的)重新創建,或者運行alter table腳本以不允許空值。 – karthikr

+0

@karthikr#1謝謝你的糾正,但是這只是在這個問題上犯的一點小錯誤。#2我應該提到它,但我也改變了表中的空設置 – glowka

回答

1

好吧,我發現了一個解釋....

它有東西在我想創建一個Person的子類的實例的代碼做繼承,即進一步。因此就出現了另一個類:

class Person(models.Model): 
    user = models.ForeignKey(User) 
    phone_number = models.CharField(max_length=20, blank=True) 
    address  = models.CharField(max_length=200, blank=True) 

class ConnectedPerson(Person): 
    connection = models.ForeignKey(AnotherClass) 
    # etc.. 

和創建人的情況下,打算將其擴展到ConnectedPerson後,我做了這樣的代碼:

#creating instance of Person: 
person = Person(user=request.user, phone_number='111111') 
person.save(force_insert=True) 

c_person = ConnectedPerson(id=person.id, connection=instance_of_another_c) 

,並使用ConnectedPerson(id=person.id)實際上殺人之前創建的Person實例將其覆蓋在數據庫中。


因此,對於任何人在處理繼承情況下,沒有太多的經驗:如果你需要使用之前創建超類實例作爲子類的實例的一部分這樣來做:

#creating person but not saving it 
person = Person(user=request.user, phone_number='111111') 

###### 
#later 
###### 

#creating subclass instance and saving 
c_person = ConnectedPerson(user=request.user, connection=instance_of_another_c) 
c_person.save() 

#saving super class instance as part of subclass instance 
person.pk = super(ConnectedPerson, c_person).pk 
person.save() 
相關問題