我正在尝试在名为SearchForm(forms.Form)的函数中抽象形式get_filters的所有过滤逻辑。

get_filters返回一个Q对象,然后视图将其用于过滤实际的查询集。因此,get_filters也不应该对查询集一无所知:它的工作只是返回可以传递给.filter()的过滤器

views.py:

def my_view(request):
    form = SearchForm(request.GET)

    if form.is_valid():
        filters = form.get_filters()
        Model.objects.filter(filters)


forms.py:

class SearchForm(forms.Form):
    """
    Fields...
    """
    def get_filters(self):
        """
        filtering logic
        """
        return Q(some_filters)


这很好。但是,我现在需要一个“ order by”字段。

我可以对get_filters函数中的Q对象执行此操作吗?或者我除了打破这种编程模式并在视图中访问form.cleaned_data之外别无选择?

最佳答案

您可以使用视图代替get_filter来执行order_by吗?

from my_app.models import Project
filters = get_filters(form)
ps = Project.objects.order_by('name').filter(filters)

关于python - Django结合Q对象和order_by,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33763993/

10-10 11:22