Order by formula

I'm filtering for stores. And I need to sort the stores by rating but the rating is considered by a complex form, I can sort them by one field but how to count for each I do not know

that is current version order by rate

shops = shops.order_by('rate')

But you need to put the formula instead of the field rate, how is this done?

class Shop(models.Model):
name = models.CharField(max_length=255, verbose_name=u'Название')
time_begin = models.TimeField(max_length=255,
                              verbose_name=u'Время начала работы')
time_end = models.TimeField(max_length=255,
                            verbose_name=u'Время окончания работы')
phone = models.CharField(max_length=255, verbose_name=u'Телефон')
preview = models.FileField(upload_to='files/shop/preview')
delivery_price = models.IntegerField(verbose_name=u'Стоимость доставки')
min_price = models.IntegerField(verbose_name=u'Мин доставка', null=True)
min_order = models.IntegerField(verbose_name=u'Минимальный заказ')
del_wait_time = models.IntegerField(verbose_name=u'Время доставки минут')
is_always = models.BooleanField(verbose_name=u'Круглосуточно?',
                                default=True, blank=True)
is_cash = models.BooleanField(verbose_name=u'Наличными',
                              default=True, blank=True)
is_card = models.BooleanField(verbose_name=u'Картой курьеру',
                              default=True, blank=True)
is_online = models.BooleanField(verbose_name=u'Онлайн-оплата',
                                default=True, blank=True)
is_points = models.BooleanField(verbose_name=u'Еда за баллы',
                                default=True, blank=True)
is_sale = models.BooleanField(verbose_name=u'Акция',
                                default=True, blank=True)
is_new = models.BooleanField(verbose_name=u'Новый магазин',
                                default=True, blank=True)
notification = models.CharField(max_length=255,
                                verbose_name=u'Важное уведомление',
                                blank=True, null=True)
email = models.CharField(max_length=255, verbose_name=u'E-mail')
review_email = models.CharField(max_length=255,
                                verbose_name=u'Review E-mail',
                                default='null')
rate = models.FloatField(max_length=255, verbose_name=u'Рейтинг')
destination = models.CharField(max_length=255,
                               verbose_name=u'Местоположение')
specific = models.CharField(max_length=255, default='',
                            verbose_name=u'Специализация ресторана')
description = models.TextField(max_length=3000,
                               verbose_name=u'Описание')
cook = models.CharField(max_length=255, verbose_name=u'Имя повара',
                        blank=True, null=True)
image_cook = models.FileField(upload_to='files/shop/cook',
                              blank=True, null=True)
desc_cook = models.TextField(max_length=3000,
                             verbose_name=u'Описание повара',
                             blank=True, null=True)
shoptype = models.ForeignKey(ShopType, verbose_name=u'Тип заведения',
                             related_name="shop")
slider = models.ManyToManyField(Slider, verbose_name=u'Слайдер',
                                related_name="slider",
                                blank=True)
kitchen = models.ManyToManyField(Kitchen)

Upvotes: 0

Views: 32

Answers (1)

Jon Kiparsky
Jon Kiparsky

Reputation: 7743

Lacking a more detailed statement of the problem, I will give a vague answer. (to be filled in if more details show up)

You could do this by annotating the queryset with a calculated value. See the documentation here

What this means is that you're going to ask the database to figure out the "rate", for example by dividing each shop's distance by its time, and add that value to the data returned for each shop. You could then do an order_by based on that field.

Upvotes: 1

Related Questions