2016-10-03 61 views
1

我想獲取每個子值的父類值嗎?我如何識別要提取的子對象?Django基於類別繼承和訪問子模型

我有這樣的Django模型結構。

class Category(models.Model): 
    name = models.CharField(max_length=80) 


class Place(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 
    category = models.ForeignKey('Category') 


class PizzaRestaurant(Place): 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 


class PastaRestaurant(Place): 
    extra = models.CharField(max_length=80) 

當我們做手術時,我們可能會像下面那樣保存對象。並按照我的預期保存到分貝中。 Place表中的兩個條目和每個子對象表中的每個條目。

a = Category() 
a.name = "pasta" 

b = Category() 
b.name = "pizza" 

a.save() 
b.save() 

x = PastaRestaurant() 
x.address = "Pasta Address" 
x.name = "Pastamonia" 
x.extra = "some extra" 
x.category = a 

y = PizzaRestaurant() 
y.address = "Pizza Address" 
y.name = "Dominos" 
y.serves_hot_dogs = 1 
y.serves_pizza = 0 
y.category = b 

x.save() 
y.save() 

現在我需要訪問這樣

p = Place.objects.get(id=1) 

我怎麼能知道,哪些對象/屬性屬於地方的對象? 所以,當我獲取具有共同屬性的地方,並且也應該能夠獲取相應的子對象值。

或者其他模型設計適合我的需求?

回答

1

如果要訪問子模型的屬性,您需要將其作爲該模型取回,即PizzaRestaurantPastaRestaurant,否則您將只會得到一個Place對象。

如果您需要獲取所有地點而不考慮子類別,請從django-model-utils查看InheritanceManager。使用這個你可以實現重載操作來執行子類特定的操作。

+0

Django的模型utils的通過1.9支持的Django 1.4。它不適用於當前版本1.10?爲Django的新版本我們不知道這是工作嗎? –

+0

我用它與1.10沒有問題。 –

1

django-polymorphic這是否精美,改善與模型繼承工作,像這樣的能力:

從polymorphic.models導入PolymorphicModel

class Place(PolymorphicModel): 
    ... 

class PizzaRestaurant(Place): 
    ... 

class PastaRestaurant(Place: 
    ... 


>>> some_place = Place.objects.create(name="Walmart") 
>>> some_pizza_place = PizzaRestaurant.objects.create(name="Slice King", address="101 Main St., Bismarck, ND", category = Category.objects.first(),serves_pizza=True) 
>>> some_pizza_place.instance_of(PizzaPlace) 
True 
>>> PizzaRestaurant.objects.all() 
queryset<['Slice King',]> 
>>> Place.objects.all() 
queryset<['Walmart', 'Slice King',]> 
+0

這將如何支持與Django的rest框架和序列化? –