用于分面的 Python 继承或额外属性

标签 python django django-haystack

首先,我对 Python/Django 非常陌生,但多年来我一直在使用其他技术。

在用户可以创建出版物的网站中(让我们以亚马逊为例),我有一个包含基本内容的 Publication 对象,例如标题、详细信息、价格等。

但是,我想包括特定于对象类型的某些属性(布料有尺寸、颜色、男士/女士;汽车有品牌、型号、发动机、变速箱等)。这个想法是使用 Haystack/Elasticsearch 对这些属性进行分面,具体取决于用户正在搜索的内容。

所以,这是基本模型:

# main publication class
class Publication(models.Model):
    OBJECT_TYPE = (
        ('cloth', 'Cloth'),
        ('electronics', 'Electronics'),
        ('car', 'Cars'),
    )
    object_type = models.CharField(max_length=30,
                                    choices=OBJECT_TYPE,
                                    default='electronics')
    title = models.CharField()
    details = models.CharField()
    # other fields...

# Haystack index
class PublicationIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    object_type = indexes.CharField(faceted=True, model_attr='object_type')
    # other fields...

问题是,我应该在哪里存储这些其他属性?

一个选择是让另一个类/模型包含详细信息和出版物的 FK。如果是这样,我应该如何建立索引呢?另一种选择是将所有发布的所有属性放在 Publication 模型中,这将是最简单但可能并不优雅。

另一种选择是继承 CarPublicationClothPublication 等。如果是这样,问题是,我如何处理基本内容以避免重复所有屏幕对应每种出版物类型。

我将只有 3 种发布类型,我不认为我会添加更多,所以进行继承,例如,是一个可行的选择(亚马逊有数百个类别,所以它是不同的)。

什么是最好的方法?

仅供引用,使用 Python 3、Django 1.9、Haystack 2.5-dev、Elasticsearch。

最佳答案

django-polymorphic处理得很好。

来自文档:

from polymorphic.models import PolymorphicModel

class Project(PolymorphicModel):
    topic = models.CharField(max_length=30)

class ArtProject(Project):
    artist = models.CharField(max_length=30)

class ResearchProject(Project):
    supervisor = models.CharField(max_length=30)


>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")
# Get polymorphic query results:

>>> Project.objects.all()
[ <Project:         id 1, topic "Department Party">,
  <ArtProject:      id 2, topic "Painting with Tim", artist "T. Turner">,
  <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]

关于用于分面的 Python 继承或额外属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903277/

相关文章:

python - Haystack 搜索一个非常短的字符字段

python - Haystack 和 ElasticSearch : Searching Related Fields; Use nested Type?

python - 在 python read_csv 执行中处理坏行

python - 当组都在同一元素中时,使用 BeautifulSoup 将 HTML 分成组

javascript - AngularJS - 如何处理 ng-repeat 与预先存在的项目

python - 如何有效地在django中递归查询?

django - 如何在管理站点的组或用户权限列表中显示添加或更改 Django 模型的权限?

django - django-haystack自动完成返回的结果太宽

python - 我不喜欢 "yaml.dump()"保存文件的方式。还有其他选择吗?

python - 使用 Tweepy 查找特定关键字的热门推文