Created
December 5, 2016 20:46
-
-
Save mustafaileri/ad5706c7c3e3db4c702ba954560d6515 to your computer and use it in GitHub Desktop.
drf-sample-search_indexes.py
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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