Фильтры django | как сделать order_by для нескольких выбранных полей, которые обрабатываются разными методами
#filters.py
class PostFilter(django_filters.FilterSet):
CHOICES = (
('created_at','Old first'),
('-created_at','New first'),
)
ordering = django_filters.ChoiceFilter(choices=CHOICES,method='ordering_filter',widget=Select(attrs={'class':'filter','id':'ordering'}))
is_interesting = django_filters.BooleanFilter(method='filter_interesting',distinct=True,widget=CheckboxInput(attrs={'class':'filter','id':'radio1','checked':False}))
class Meta:
model = Post
fields = []
def ordering_filter(self,queryset,name,value):
return queryset.order_by(value)
def filter_interesting(self,queryset,name,value):
if value:
followed = User.objects.filter(followers=getattr(self.request,'user'))
return queryset.annotate(flag=Q(author__in=followed)).order_by('-flag','-created_at')
return queryset
#views.py
class HomePage(LoginRequiredMixin,ListView):
model = Post
login_url = reverse_lazy('login')
context_object_name = 'filter'
template_name = 'main/home.html'
def get_queryset(self):
posts = Post.objects.all().select_related('author','profile','author__profile').prefetch_related('liked','images','viewers','author__followers')
f = PostFilter(request=self.request,queryset=posts,data=self.request.GET)
return f
#main/home.html
<div class="cd-filter">
<form method="get" class="cd-filter-form cd-filter-form--last">
<div class="cd-filter-block">
<div class="cd-filter-content">
<div class="cd-select cd-filters">
{{filter.form.ordering}}
</div>
</div>
</div>
<div class="cd-filter-block">
<ul class="cd-filter-content cd-filters list" style="list-style: none;">
<li>
{{filter.form.is_interesting}}
</li>
</ul>
</div>
<button class="cd-filter__submit" type="submit">Confirm</button>
</form>
#комментарий от меня
проблема в том, что я не могу фильтровать по упорядочиванию и интересно сразу, я фильтрую только по полю ниже в объявлении полей класса (применяется только последний order_by) и поэтому, как я могу поместить их в один order_by?