【问题标题】:How to add new field to filtered query如何将新字段添加到过滤查询
【发布时间】:2020-01-24 21:51:37
【问题描述】:

我正在尝试添加一个新列,我需要根据 FilterSet 中的其他模型对其进行一些操作。

我的看法是这样的:

class FilteredListView(ListView):
    filterset_class = None

    def get_queryset(self):
        queryset = super().get_queryset()
        self.filterset = self.filterset_class(self.request.GET, queryset=queryset)
        return self.filterset.qs.distinct()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['filterset'] = self.filterset
        querysetPaises = Pais.objects.all().filter(paisActivo=1).order_by('nombrePais')
        context['paises']=querysetPaises
        return context

class ListadoPartnerView(FilteredListView):
    filterset_class = PartnerFilter
    paginate_by = 10
    model = IngresosPersonas
    fields = ['idPlataforma', 'number_plataforma', 'contactoinfo']
    template_name = 'usuarios/listadoPartners.html'

我的过滤器是:


class PartnerFilter(django_filters.FilterSet):
    class Meta:
        model = IngresosPersonas
        fields = ['idPlataforma', 'number_plataforma']

基本上我想在模板接收的过滤器集中包含一个新列,该列未包含在模型中。

我尝试访问 filterset.qs 但没有成功

非常感谢

【问题讨论】:

  • 这是你的答案stackoverflow.com/a/12129934
  • 如果我在 filterset_class.model.objects.all() 中为 obj 做: print(obj) 我得到错误类型对象 'PartnerFilter' has no attribute 'model'
  • 我不确定上下文,但我认为您要查找的是 filterset_class.objects.all() 而不是 filterset_class.model.objects.all()
  • 不幸的是类型对象'PartnerFilter'没有属性'objects'

标签: python django django-models filter


【解决方案1】:

您可以将非模型字段添加到 FilterSet 但您需要手动指定 method 这将由此过滤器触发:

class PartnerFilter(django_filters.FilterSet):
    new_field = django_filters.CharFilter(method="filter_new_field")
    class Meta:
        model = IngresosPersonas
        fields = ['idPlataforma', 'number_plataforma', 'new_field']

    def filter_new_field(self, queryset, name, value):
            return queryset.filter() # your extra filters here

如果您需要在表示级别(模板)添加非模型字段,您可以在模型中定义属性:

class MyMode(models.Model):
    @property
    def new_field(self):
        return "some value"

在模板中你可以像{{ obj.new_field }}这样访问这个字段。

【讨论】:

  • 感谢您的回答。我真的不需要按新字段进行过滤,我想将新字段包含在返回到模板的对象列表中。我需要在哪里进行操作才能包含它?
  • @AlbertoCarmona 嗯,在这种情况下,我想你可以添加模型的属性。
  • 非常感谢,工作完美!!。只是出于好奇,我可以定义一个查询集并注释一个字段而不是将模型传递给过滤器吗?
  • 不客气!我想您可以对其进行注释,您可以为此使用Valuedocs.djangoproject.com/en/3.0/ref/models/expressions/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多