Django模型继承和访问基于类别的子项

时间:2016-10-03 16:45:03

标签: django python-2.7 django-models

我想获取每个子值的父类值?如何识别要获取的子对象?

我有像这样的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)

我怎么知道哪些对象/属性属于地方对象? 因此,当我获取具有公共属性的位置时,也应该能够获得相应的子对象值。

或者其他任何模型设计都能满足我的需求吗?

2 个答案:

答案 0 :(得分:1)

如果您想访问子模型的属性,则需要将其作为该模型获取,即PizzaRestaurantPastaRestaurant,否则您只会获得Place个对象

如果您需要获取所有地方而不考虑子类,请查看django-model-utils中的InheritanceManager。使用它可以实现重载操作以执行特定于子类的操作。

答案 1 :(得分: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',]>