django filter.py @property def qs用户

问题描述

我试图将associated_portfolios字段对象过滤为仅由用户创建的那些对象。在尝试添加分页之前哪个方法可行(如果删除当前为associated_portfolios使用的过滤器,则该方法有效)

我相信我需要做的是删除

def associated_portfolios

这是因为新设置似乎没有超出请求。相反,我应该使用此方法https://django-filter.readthedocs.io/en/stable/guide/usage.html#filtering-the-primary-qs

filters.py 当前;添加分页后无法正常工作

def associated_portfolios(request):
    associated_portfolios = Portfolio.objects.filter(user=request.user)
    return associated_portfolios.all()

class TradeFilter(django_filters.FilterSet):
    associated_portfolios = django_filters.ModelMultipleChoiceFilter(queryset=associated_portfolios)
    date_range = django_filters.DateFromToRangeFilter(label='Date Range',field_name='last_entry',widget=RangeWidget(attrs={'type': 'date'}))
    
    class Meta:
        model = Trade
        fields = ['status','type','asset','symbol','broker','patterns','associated_portfolios']

filters.py 基于文档的可能解决方

class TradeFilter(django_filters.FilterSet):
    date_range = django_filters.DateFromToRangeFilter(label='Date Range','associated_portfolios']

    @property
    def qs(self):
        parent = super().qs
        user = getattr(self.request,'user',None)
        return parent.filter(user=user)

问题是没有错误消息,但仍显示不是由用户创建的对象。从我在SOF和文档中看到的@property尝试了十几种变体,但还没有成功。

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.distinct() #.filter(user=self.request.user).order_by('last_entry')

    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_class
        return context

# Attempt @ Combining Filter and List View to get: TradeFilteredListView
class TradeFilteredListView(FilteredListView):
    model = Trade
    filterset_class = TradeFilter
    paginate_by =  5
    template_name = 'portfolios/Trade_filter.html'

旁注:

  1. 我使用其他视图设置的原因是由于分页,我遵循本指南使用django-filters设置分页https://www.caktusgroup.com/blog/2018/10/18/filtering-and-pagination-django/

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)