2016-10-03 60 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框架和序列化? –