编程语言
首页 > 编程语言> > Python继承或用于构面的其他属性

Python继承或用于构面的其他属性

作者:互联网

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

在一个网站上,用户可以创建发布(例如,以亚马逊为例),我有一个发布对象,其中包含基本的内容,例如标题,详细信息,价格等.

但是,我希望包含某些特定于对象类型的属性(衣服将具有大小,颜色,男/女;汽车将具有品牌,型号,引擎,变速器等).想法是使用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.如果是这样,我应该如何建立索引呢?另一个选择是将所有出版物的所有属性都放入“出版物”模型中,这将是最简单的方法,但可能并不美观.

另一个选择是进行继承以具有CarPublication,ClothPublication等.如果是这样,问题是,我将如何处理基本内容,以避免为每种发布类型复制所有屏幕.

我将只有3种发布类型,而且我认为我不会添加更多类型,因此,例如,进行继承是一个可行的选择(Amazon有数百个类别,因此有所不同).

最好的方法是什么?

仅供参考,使用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,django,django-haystack
来源: https://codeday.me/bug/20191119/2033904.html