Django FilterSet с отличным AND order_by - PullRequest
1 голос
/ 20 июня 2019

Я хочу использовать django-фильтр для создания FilerSet с различными результатами для поля A (Minutes.case), упорядоченного по полю B (case__case_filed_date). База данных является PostgreSQL.

Комментируемые строки в классе MinutesListView - это вещи, которые я пробовал (в различных конфигурациях).

models.py

class Case(models.Model):
    case_filed_date = models.DateField()
    case_number = models.CharField(max_length=25, unique=True)
    as_of_timestamp = models.DateTimeField()

    def __str__(self):
        return self.case_number


class Minutes(models.Model):
    case = models.ForeignKey(Case, on_delete=models.CASCADE)
    minute_entry_text = models.TextField(blank=True, null=True)
    minute_entry_date = models.DateField(blank=True, null=True)
    minute_entry_type_text = models.CharField(max_length=255, blank=True, null=True)

filters.py

class MinuteFilterSet(df.FilterSet):
    case__case_number = df.CharFilter(lookup_expr='icontains', label='Case Number', distinct=True)
    minute_entry_text = df.CharFilter(lookup_expr='icontains', label='Minutes Text')

    class Meta:
        model = Minutes
        fields = ['minute_entry_text']
        order_by = ['-case__case_filed_date']

views.py:

class FilteredListView(ListView):
    filterset_class = None

    def get_queryset(self):
        # Get the queryset however you usually would.  For example:
        queryset = super().get_queryset()
        # Then use the query parameters and the queryset to
        # instantiate a filterset and save it as an attribute
        # on the view instance for later.
        self.filterset = self.filterset_class(self.request.GET, queryset=queryset)
        # Return the filtered queryset
        return self.filterset.qs

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Pass the filterset to the template - it provides the form.
        context['filterset'] = self.filterset
        return context


class MinutesListView(FilteredListView):
    filterset_class = filters.MinuteFilterSet
    paginate_by = 25

    # ordering = '-case__case_filed_date'
    # queryset = Minutes.objects.all()
    queryset = Minutes.objects.distinct('case')

Текущий код показывает отличные, неупорядоченные результаты. Когда я могу получить упорядоченные результаты, дела (case_number) дублируются. Я прочитал документы, касающиеся Different () с помощью order_by () в Django / PostGreSQL, но я все еще что-то упускаю.

...