Django 过滤子类模型

1 投票
1 回答
2393 浏览
提问于 2025-04-16 16:50

我有以下这些模型:

class foo(models.model):
    name = models.CharField(max_length=255)
    size = models.PositiveIntegerField()

class bar(foo):
    colour = models.CharField(max_length=25)

class baz(foo):
    material = models.CharField(max_length=25)

我想根据网址中的参数来筛选这些模型。比如,如果网址是 http://www.mysite.com/catalogue/foo?size=3,那么就会显示所有大小为3的 foobarbaz 对象。

如果网址是 http://www.mysite.com/catalogue/foo?size=3&colour=red&colour=green,那么就会显示所有 foo 对象,这些对象的属性是 sizecolour(也就是 bar 对象),前提是大小为3,颜色是红色或绿色。

这样可以实现吗?

1 个回答

2

(更新:这个回答比我下面写的内容更好。)

这篇文章解释了为什么在Django中这样做效率低下——主要是因为这需要在所有子类的表之间进行复杂的连接查询,这样会消耗很多资源。(我曾经写过一个支持多态的ORM,查询很快就变得复杂。Django的开发者在这方面做出了正确的选择。)

文章中描述了一种编写MixIn的方法,可以单独查询每个子类。如果你在整个应用中都需要这种功能,可以考虑实现类似的东西。

如果只是为了一个单独的视图,可能更简单(更快,也更容易理解)直接编写你的视图,分别查询每个子类,然后创建一个包含所有结果的列表。

撰写回答