filter當用戶選擇一個復選框時,我需要合并和使用 3個查詢集。Ajax 作業正常,但我在顯示過濾資料時遇到了困難,因為我收到了這個錯誤:
AttributeError: 'itertools.chain' object has no attribute 'filter'
當我嘗試像這樣迭代 1 個模型時,favourite_list=Product.objects.all()一切正常,但就我而言,我需要過濾來自 3 個不同模型的資料。
我嘗試使用list(chain(fa, fv, fp)),但它給了我list object has no attribute filter錯誤。
def filter_favourites(request):
favourite_articles = request.GET.getlist('favourite_articles[]')
favourite_video = request.GET.getlist('favourite_video[]')
favourite_product = request.GET.getlist('favourite_product[]')
fa = request.user.favourite_article.all().distinct() #list of favourites items from Article model
fv = request.user.favourite_video.all().distinct() #list of favourites items from Video model
fp = request.user.favourite_product.all().distinct() #list of favourites items from Product model
favourite_list = chain(fa, fv, fp)
if len(favourite_articles) > 0:
favourite_list = favourite_list.filter(title__in=favourite_articles).distinct()
if len(favourite_video) > 0:
favourite_list = favourite_list.filter(title__in=favourite_video).distinct()
if len(favourite_product) > 0:
favourite_list = favourite_list.filter(title__in=favourite_product).distinct()
context = {
'combined_queryset': favourite_list,
}
ajax_template = render_to_string('user/user_favourites_ajax.html', context)
return JsonResponse({'data': ajax_template})
我的問題是如何解決這個錯誤?我應該如何合并fa, fv, pd,以便它們表現得像普通的查詢集,我可以filter對它們使用方法。
uj5u.com熱心網友回復:
filter方法適用于QuerySet型別的物件,因此您不能在串列和鏈上使用它。
相反,您可以在過濾后對收藏夾進行分組
def filter_favourites(request):
favourite_articles = request.GET.getlist('favourite_articles[]')
favourite_video = request.GET.getlist('favourite_video[]')
favourite_product = request.GET.getlist('favourite_product[]')
fa = request.user.favourite_article.all().distinct() #list of favourites items from Article model
fv = request.user.favourite_video.all().distinct() #list of favourites items from Video model
fp = request.user.favourite_product.all().distinct() #list of favourites items from Product model
if len(favourite_articles) > 0:
fa = fa.filter(title__in=favourite_articles)
if len(favourite_video) > 0:
fv = fv.filter(title__in=favourite_video)
if len(favourite_product) > 0:
fp = fp.filter(title__in=favourite_product)
favourite_list = chain(fa, fv, fp)
context = {
'combined_queryset': favourite_list,
}
ajax_template = render_to_string('user/user_favourites_ajax.html', context)
return JsonResponse({'data': ajax_template})
并且不需要在條件之后再次使用 distinct,它在
編輯之前已經完成了一次:
def filter_favourites(request):
favourite_articles = request.GET.getlist('favourite_articles[]')
favourite_video = request.GET.getlist('favourite_video[]')
favourite_product = request.GET.getlist('favourite_product[]')
favourite_titles = favourite_articles favourite_video favourite_product
favourites_items_list = [
request.user.favourite_article.all().distinct(), #list of favourites items from Article model
request.user.favourite_video.all().distinct(), #list of favourites items from Video model
request.user.favourite_product.all().distinct(), #list of favourites items from Product model
]
if len(favourite_titles) > 0:
for ind, f in enumerate(favourites_items_list):
favourites_items_list[ind] = f.filter(title__in=favourite_titles)
favourite_list = chain(*favourites_items_list)
context = {
'combined_queryset': favourite_list,
}
ajax_template = render_to_string('user/user_favourites_ajax.html', context)
return JsonResponse({'data': ajax_template})
uj5u.com熱心網友回復:
嗯,看來這QuerySet.union()就是你要找的。
favourite_list = fa.union(fv, fp)
至于您最初的問題,型別也list沒有intertools.chain(回傳的型別itertools.chain())型別沒有filter()方法,因此出現錯誤。
>>> chain(["a"], ["b"])
<itertools.chain object at 0x7fd3f0a86580>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/503864.html
