Django使用mptt和mod的多态性

2024-10-03 19:30:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个多态模型,模型是:

class AbstractCategory(PolymorphicMPTTModel):
    name = models.CharField(max_length=100)
    parent = PolymorphicTreeForeignKey('self', null=True, blank=True,
                                       related_name='sub_categories')
class Category(AbstractCategory):
    def get_fields(self):
        pass 

class FakeCategory(AbstractCategory):
    def get_fields(self):
        pass
class AbstractProductModel(PolymorphicModel):
    name = models.CharField(max_length=100)

class ProductModel(AbstractProductModel):
    category = models.ForeignKey('category.Category', related_name='product_models')

class FakeProductModel(AbstractProductModel):
    category = models.ForeignKey('category.AbstractCategory', related_name='fake_product_models')

假设我有3个类别的对象:数码、移动-->数码、相机-->数码。 数码是手机和相机的母体,这是树状结构的简单例子。 我想得到所有型号,他们的类别是数码或数码的子类别,如手机或相机。我用的是:

^{pr2}$

我得到这个错误: 无法将关键字“abstractcategory\u ptr”解析到字段中。选项包括:类别,…

找不到原因。在


Tags: name模型selftruemodels类别lengthmax
1条回答
网友
1楼 · 发布于 2024-10-03 19:30:22

虽然我不太明白category__in过滤器为什么会中断(它应该可以工作!),您可以以更好的方式实现此查询。当您使用mptt字段联接时,所有操作都在单个查询中发生,而不是WHERE x IN (SELECT ..)子查询。在

class ProductModelQuerySet(PolymorphicQuerySet):
    def get_descendants(self, category, include_self=False):
        # narrow one level deeper for include_self=False effect
        narrow = 0 if include_self else 1

        # MPTT optimization, no need for a subquery.
        return self.filter(
            category__tree_id=category.tree_id,
            category__lft__gte=category.lft + narrow,
            category__rght__lte=category.rght - narrow,
        )

您可以使用以下方法查询:

^{pr2}$

相关问题 更多 >