按子类类型过滤

时间:2018-10-20 11:32:10

标签: python django polymorphism django-queryset

可以说我们有一个类Place和一个类Restaurant继承自它:

from django.db import models

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

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

如果我有一个与地点有关的课程Tag

class Tag(models.Model):
    name = models.CharField(max_length=50)
    tagged = models.ManyToManyField(Place, related_name="tags")

对于给定的标签,我如何获取一个查询集,选择所有具有此标签的餐厅,而不选择其他类型的地方?

1 个答案:

答案 0 :(得分:1)

最简单的方法是从filter调用Restaurant.objects,例如:

Restaurant.objects.filter(tags=tag)

但是,如果您想从filter调用Place.objects,则必须在父模型中使用诸如Django-Polymorphic之类的Django多态应用之一,因为Django默认不支持模型多态。

注意:请阅读This article有关OOP多态性的知识和This article,以获取有关Django模型继承的一些其他信息。