首页 > 解决方案 > 具有不同 AND order_by 的 Django FilterSet

问题描述

我想使用 django-filter 为字段 A(Minutes.case)创建一个具有不同结果的 FilerSet,按字段 B(case__case_filed_date)排序。数据库是 PostgreSQL。

MinutesListView 类中的注释行是我尝试过的(在各种配置中)。

模型.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)

过滤器.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']

视图.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)被重复。我已经在 Django/PostGreSQL 中阅读了关于 distinct() 和 order_by() 的文档,但我仍然缺少一些东西。

标签: djangodjango-filter

解决方案


推荐阅读