why the @property django decorator doesn't work

Question:

I need to pass the ‘def get_sale’ method to the model in views to sort the products by get_sale, but after passing it an error comes out

models.py

@property
    def get_sale(self):
        '''Расчитать стоимость со скидкой'''
        price = int(self.price * (100 - self.sale) / 100)
        return price

views.py

class SortItems(GoodsHome):#сортировка товара
    def get_queryset(self):
        sort_types = {
            '0': '-time_create',
            '1': 'time_create',
            '2': 'get_sale',
            '3': '-get_sale',
        }

        sort_type = sort_types[self.kwargs['sort_type']]

        if 'query' in self.kwargs:
            query = self.kwargs['query']
            return super(SortItems, self).get_queryset().filter(Q(artist__icontains=query) |
                                                                Q(album__icontains=query)).order_by(sort_type)

        return super(SortItems, self).get_queryset().order_by(sort_type)

mistake

Cannot resolve keyword ‘get_sale’ into field

Asked By: Lightcart

||

Answers:

That’s because get_sale is not a Django field as required by order_by.

I would recommend you use annotations with F expressions.

queryset = (
    super(SortItems, self)
    .get_queryset()
    .filter(
         Q(artist__icontains=query) 
         |
         Q(album__icontains=query)
    )
    .annotate(get_sale=int(F(price) * (100 - F(sale)) / 100))
)

return queryset.order_by(sort_type)
Answered By: Raydel Miranda
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.