2014-01-23 27 views
0

公共字段我有一些機型:Django的:存放於父模型

class Place(models.Model): 
    name = models.CharField(unique=True) 

class Bar(Place): 
    drinks = models.ManyToManyField('Drink') 

class Restaurant(Place): 
    meals = models.ManyToManyField('Meals') 

這是繼承結構的多表,其中每一條也只供應飲料,每個餐廳只供應餐點。不過,我需要每個地方的名稱在所有地方都是唯一的 - 因此,父母的模型是Place

現在,多表繼承假設父母和孩子是分開的實體。這意味着,當我想創建一個新的Bar,我應該是這樣的:

>> parent = Place(name='Myplace') 
>> parent.save() 
>> child = Bar(place=parent, drinks=mydrinklist) 
>> child.save() 

但在我的情況下,Place不是一個獨立的實體:它不應該通過自身的存在。這只是一個有一些限制的共享存儲。我想有這樣的事情:

>> child = Bar(name='Myplace', drinks=mydrinklist) 
>> child.save() 

name屬性被自動傳遞到底層父模型,當save()被稱爲默默地創建了一個Place模型。 SQLAlchemy可以通過多表繼承來實現這一點。有沒有辦法在Django中實現相同的功能?

+0

您是否嘗試覆蓋'Place.save'方法並實現您在那裏描述的邏輯? – lanzz

+1

你嘗試了你的建議語法嗎?這正是多表繼承在Django中的工作原理,並且您希望的語法可以與您顯示的模型正確匹配。 (事實上​​,你的第一個版本*不會工作,因爲'parent'不是欄上的字段。) –

+0

哇,這實際上是有效的。我在django-rest-framework中的'name'字段遇到了一些錯誤,並認爲這與錯誤的'save'調用相關聯;看起來我錯了。非常感謝。 – rocknrollnerd

回答

2

Django的abstract base classes解決的共享模式之間的共同領域的問題:

class Place(models.Model): 
    name = models.CharField(unique=True) 

    class Meta: 
     abstract = True 

編輯:說了這麼多,因爲丹尼爾在評論中提到的,你提出的解決方案應該只是罰款。這裏有更多關於Django's multi-table inheritance

+1

但是,全球「獨特」約束呢?現在'name'是否應該分別存儲在'bar'和'restaurant'表中? – rocknrollnerd

0

丹尼爾·羅斯曼提到的,我是完全錯誤的:Django的不實際工作的方式我描述。