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
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)
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
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)