“列表”对象没有属性“过滤器”

时间:2019-07-16 03:57:22

标签: django django-models django-views

def g_view(request):
    header_category = Category.objects.all()
    m = Type1.objects.all()
    r=Type2.objects.all()
    g=Type3.objects.all()
    from itertools import chain
    orders=list(sorted(chain(m,r,g),key=lambda objects:objects.start))

    mquery = request.GET.get('m')
    if mquery:
        orders = orders.filter(
            Q(name__icontains=mquery) |
            Q(game__name__icontains=mquery) |
            Q(teams__name__icontains=mquery)).distinct()

(类型是抽象的,而type1 type2 type3是继承的类)

我得到了这个错误的“列表”对象,没有属性“过滤器”

2 个答案:

答案 0 :(得分:2)

基本上,当您chain使用多个查询集时,您会失去查询集的功能。链接后,它们成为迭代器的一部分。您可以通过迭代或显式调用list来访问迭代器的值。您需要在链接查询集之前进行查询。

query = Q(name__icontains=mquery) |
        Q(game__name__icontains=mquery) |
        Q(teams__name__icontains=mquery)

m = Type1.objects.filter(query).distinct()
r = Type2.objects.filter(query).distinct()
g = Type3.objects.filter(query).distinct()


orders=list(sorted(chain(m,r,g),key=lambda objects:objects.start))

答案 1 :(得分:0)

这里的订单被明确转换为列表,列表没有过滤器属性

orders=list(sorted(chain(m,r,g),key=lambda objects:objects.start))

您要查找的是QuerySet,应该在Model上查询。

如果订单是模型列表,则应执行

for order in orders:
   orders = order.filter(
            Q(name__icontains=mquery) |
            Q(game__name__icontains=mquery) |
            Q(teams__name__icontains=mquery)).distinct()