Django-фильтр Используйте lookup_choices для получения пользовательских результатов
У меня есть поле profit_loss_value_fees
и в этом поле я хотел бы, чтобы у пользователя была выпадающая опция, чтобы показать все сделки, которые были прибылью/убытком/убытком.
Profit = Trade.profit_loss_value_fees > 0
Loss = Trade.profit_loss_value_fees < 0
Scratch = Trade.profit_loss_value_fees == 0
Что я сделал, так это result1
, который работает, но я не получаю красивого выпадающего списка, как упоминалось выше. Это два пустых поля, в которые пользователь может ввести, скажем, 1 и 100, и тогда отобразятся все сделки в этом диапазоне. Это работает, но не так, как хотелось бы.
filters.py
class StatsPortfolioFilter(django_filters.FilterSet):
# Drop down with 3 options (Win, Loss, Scratch) using the Trade Field: profit_loss_value_fees
result1 = django_filters.RangeFilter(
field_name='profit_loss_value_fees',
label='result1',
)
Я попробовал использовать LookupChoiceFilter
для создания 3 выпадающих опций, и это сработало. Проблема в том, что эти опции ничего не делают, очевидно. Как я могу добавить
filters.py
class StatsPortfolioFilter(django_filters.FilterSet):
# I need something that gives the lookup_choices value
# w = Trade.profit_loss_value_fees > 0
# l = Trade.profit_loss_value_fees < 0
# s = Trade.profit_loss_value_fees == 0
# Drop down with 3 options (Win, Loss, Scratch) using the Trade Field: profit_loss_value_fees
result = django_filters.LookupChoiceFilter(
field_name='profit_loss_value_fees', # field_name focuses on field relatetion
label='Result',
# field_class=forms.DecimalField,
lookup_choices=[
('w', 'Win'),
('l', 'Loss'),
('s', 'Scratch'),
]
)
Пока нет никаких сообщений об ошибках, потому что я застрял на том, как действовать дальше.
Попробуйте сделать пользовательский фильтр поля и метода, чтобы получить правильный запрос, как показано ниже
class StatsPortfolioFilter(django_filters.FilterSet):
WIN_LOSS_CHOICES = (
('w', 'Win'),
('l', 'Loss'),
('s', 'Scratch'),
)
result = django_filters.ChoiceFilter(empty_label='---------', label="Result",
choices=WIN_LOSS_CHOICES, method="trade_win_loss")
def trade_win_loss(self, queryset, name, value):
if (value == 'w'):
return queryset.filter(profit_loss_value_fees__gt=0)
if (value == 'l'):
return queryset.filter(profit_loss_value_fees__lt=0)
if (value == 's'):
return queryset.filter(profit_loss_value_fees= 0)
return queryset