Skip to content

Instantly share code, notes, and snippets.

@mustafaileri
Created December 5, 2016 20:46
Show Gist options
  • Save mustafaileri/ad5706c7c3e3db4c702ba954560d6515 to your computer and use it in GitHub Desktop.
Save mustafaileri/ad5706c7c3e3db4c702ba954560d6515 to your computer and use it in GitHub Desktop.
drf-sample-search_indexes.py
from haystack import indexes
from models import Model
from django.db.models import Min, Max, Avg
class ModelIndex(indexes.SearchIndex, indexes.Indexable):
id = indexes.IntegerField()
text = indexes.CharField(document=True, use_template=True)
transmission_type = indexes.CharField()
fuel_type = indexes.CharField()
body_type = indexes.CharField()
engine_volume = indexes.IntegerField(model_attr='engine_volume')
horse_power = indexes.IntegerField(model_attr='horse_power')
segment = indexes.CharField()
price = indexes.IntegerField(model_attr='price', null=True)
average_consumption = indexes.FloatField(model_attr='average_fuel_consumption', null=True)
car_id = indexes.CharField()
car_name = indexes.CharField(model_attr='car')
car_url = indexes.CharField()
brand_id = indexes.CharField()
brand_name = indexes.CharField()
brand_url = indexes.CharField()
model_url = indexes.CharField(model_attr='url')
series = indexes.CharField(model_attr='series', null=True)
car_min_price = indexes.FloatField(null=True)
car_max_price = indexes.FloatField(null=True)
car_min_consumption = indexes.FloatField(null=True)
car_max_consumption = indexes.FloatField(null=True)
fuel_type_text = indexes.CharField(model_attr='fuel_type')
transmission_type_text = indexes.CharField(model_attr='transmission_type')
body_type_text = indexes.CharField(model_attr='body_type')
commercial = indexes.BooleanField(default=False)
smart_rate = indexes.IntegerField(model_attr='smart_rate', null=True)
car_smart_rate = indexes.FloatField(null=True)
image = indexes.CharField(null=True)
def prepare_text(self, obj):
return " ".join([obj.car.brand.name, obj.car.name, obj.name])
def prepare_fuel_type(self, obj):
return obj.fuel_type.type
def prepare_body_type(self, obj):
return obj.body_type.type
def prepare_transmission_type(self, obj):
return obj.transmission_type.type
def prepare_id(self, obj):
return obj.id
def prepare_segment(self, obj):
return obj.car.segment
def prepare_car_id(self, obj):
return obj.car.id
def prepare_car_url(self, obj):
return obj.car.url
def prepare_brand_id(self, obj):
return obj.car.brand.id
def prepare_brand_id(self, obj):
return obj.car.brand.name
def prepare_brand_url(self, obj):
return obj.car.brand.url
def prepare_car_min_price(self, obj):
car = obj.car
query = car.models.all().aggregate(min=Min('price'))
return query['min']
def prepare_car_max_price(self, obj):
car = obj.car
query = car.models.all().aggregate(max=Max('price'))
return query['max']
def prepare_car_min_consumption(self, obj):
car = obj.car
query = car.models.all().aggregate(min=Min('average_fuel_consumption'))
return query['min']
def prepare_car_max_consumption(self, obj):
car = obj.car
query = car.models.all().aggregate(max=Max('average_fuel_consumption'))
return query['max']
def prepare_car_smart_rate(self, obj):
car = obj.car
query = car.models.all().filter(smart_rate__isnull=False).aggregate(avg=Avg('smart_rate'))
return query['avg']
def prepare_commercial(self, obj):
return obj.car.commercial
def prepare_image(self, obj):
query = obj.car.images.filter(type='isometric', body_type=obj.body_type).values('path')
if query:
return query[0]['path']
return None
def get_model(self):
return Model
def index_queryset(self, using=None):
return self.get_model().objects.filter(status="active", price__gte=0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment