django过滤器:在一个过滤器中合并2个模型
我使用并拥有两个具有相同字段名称的模型,并且两个模型都需要一个筛选表单(对于模型,不是单独的筛选表单,因为对于两个字段,它将变成4个具有相同名称的表单字段) 我现在无法将视图配置为获取模型的合并查询集:django过滤器:在一个过滤器中合并2个模型,django,django-queryset,django-filter,Django,Django Queryset,Django Filter,我使用并拥有两个具有相同字段名称的模型,并且两个模型都需要一个筛选表单(对于模型,不是单独的筛选表单,因为对于两个字段,它将变成4个具有相同名称的表单字段) 我现在无法将视图配置为获取模型的合并查询集: def wallpost_list(request): vk = VkwallpostFilter(request.GET, queryset=Vkwallpost.objects.all()) fb = FbpagepostFilter(request.GET, queryse
def wallpost_list(request):
vk = VkwallpostFilter(request.GET, queryset=Vkwallpost.objects.all())
fb = FbpagepostFilter(request.GET, queryset=Fbpagepost.objects.all())
items = list(vk) + list(fb)
items.sort(key=lambda i: i.date_created, reverse=True)
return render_to_response('vk_list.html', {'filter': items})
正如你们所看到的,我可以将两个模型合并到一个列表中,并作为“过滤器”传递给模板,但在这个模板中,整个表单消失了!顺便说一下,过滤正在工作。
我猜它为什么会消失——因为它不知道在过滤器中选择哪个类
所以我需要在一个过滤器中合并两个模型我看到了你的github帖子:)
您可以执行vk.qs和fb.qs来获得过滤后的查询集。然后,在您的上下文中,您需要vk和/或fb,因为它们负责表单。我自己能够解决这个问题,但没有django筛选器模块,下面是完整的代码。 关键是使用标准的django视图来显示表单(可以在文档中找到),在表单逻辑之后,我添加了负责显示帖子列表的代码(从行开始,标准={}) 关键部分是将url参数的dict传递给两个模型的查询集,并根据url参数“source”选择要在postlist中显示的内容:
if source == 'vk':
items = list(vkposts)
elif source == 'fb':
items = list(fbposts)
else:
items = list(vkposts) + list(fbposts)
所以全景图:
def wallpost_list(request, page_number=1):
success = False
project = ''
date_created = ''
text = ''
source = ''
if request.method == 'POST':
postfilter_form = PostfilterForm(request.POST)
if postfilter_form.is_valid():
success = True
project = postfilter_form.cleaned_data['project']
date_created = postfilter_form.cleaned_data['date_created']
#text = postfilter_form.cleaned_data['text']
return redirect('posts/?project=%s&date_created=%s' % (project, date_created))
else:
postfilter_form = PostfilterForm(initial={'project':request.GET.get('project', '3'), 'date_created':request.GET.get('date_created', '3'),})
criteria = {}
last_date = date(2017, 12, 31)
if 'author' in request.GET:
criteria['from_id'] = int(request.GET['author'])
success = True
if 'likes' in request.GET:
criteria['likes.count'] = int(equest.GET['likes']) # {'$in': [int(sex) for sex in request.GET.getlist('sex')]}#int(request.GET['sex']) #/?group=20548110&sex=1&sex=2 # This will return [1,2]
success = True
if 'comments' in request.GET:
criteria['comments.count'] = int(request.GET['comments']) # {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
if 'project' in request.GET:
#project = Userproject.objects.get(name=self.request.GET['project'])
criteria['project__name'] = request.GET['project']
success = True
if 'sentiment' in request.GET:
criteria['sentiment'] = request.GET['sentiment'] # {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
if 'date_saved' in request.GET:
criteria['date_saved__range'] = (parse(request.GET['date_saved']).date(), last_date) # 'date': {'$gte': int(time.mktime(date_saved.timetuple()))}
success = True
if 'date_created' in request.GET:
criteria['date_created__range'] = (parse(request.GET['date_created']).date(), last_date) # 'date': {'$gte': int(time.mktime(date_saved.timetuple()))}
success = True
if 'source' in request.GET:
source = request.GET['source']
success = True
print(criteria)
vkposts = Vkwallpost.objects.filter(**criteria).order_by("-date_created")#[:5]
fbposts = Fbpagepost.objects.filter(**criteria).order_by("-date_created")#[:5]
if source == 'vk':
items = list(vkposts)
elif source == 'fb':
items = list(fbposts)
else:
items = list(vkposts) + list(fbposts)
items.sort(key=lambda i: i.date_created, reverse=True)
post_list = items
current_page = Paginator(post_list, 20)
# context['post_list'] = items # post_list это VK + FB posts
# vk = VkwallpostFilter(request.GET, queryset=Vkwallpost.objects.all())
# fb = FbpagepostFilter(request.GET, queryset=Fbpagepost.objects.all())
# items = list(vk) + list(fb)
# items.sort(key=lambda i: i.date_created, reverse=True)
return render_to_response('vk_list.html', {'post_list': current_page.page(page_number), 'postfilter_form': postfilter_form,
'project': project, 'date_created': date_created, 'source': source, 'text': text, 'success': success}
, context_instance=RequestContext(request))
@混合是的,当然,我得到了一个错误“不支持|的操作数类型”:“VkwallpostFilter”和“FbpagepostFilter”。我想这是因为VkwallpostFilter不是queryset,它是一个筛选器类。还尝试了在queryset=Vkwallpost.objects.all()中合并,但也没有Luck您能提供完整的代码吗?在上下文中,我需要合并的过滤器,而不是vk和fb的分离,想象一下我会分离,然后对于2个文件,我的用户需要输入2x filters=4,只需使用一个表单,它创建get参数,如:?date_created=2015-12-24。这将自动过滤两个过滤器。@我想这是我们之间的误解)我在问题中指出,如果我用一个表单来表示两个Q,我认为根本没有。我可以自己修复,但没有django过滤器模块
def wallpost_list(request, page_number=1):
success = False
project = ''
date_created = ''
text = ''
source = ''
if request.method == 'POST':
postfilter_form = PostfilterForm(request.POST)
if postfilter_form.is_valid():
success = True
project = postfilter_form.cleaned_data['project']
date_created = postfilter_form.cleaned_data['date_created']
#text = postfilter_form.cleaned_data['text']
return redirect('posts/?project=%s&date_created=%s' % (project, date_created))
else:
postfilter_form = PostfilterForm(initial={'project':request.GET.get('project', '3'), 'date_created':request.GET.get('date_created', '3'),})
criteria = {}
last_date = date(2017, 12, 31)
if 'author' in request.GET:
criteria['from_id'] = int(request.GET['author'])
success = True
if 'likes' in request.GET:
criteria['likes.count'] = int(equest.GET['likes']) # {'$in': [int(sex) for sex in request.GET.getlist('sex')]}#int(request.GET['sex']) #/?group=20548110&sex=1&sex=2 # This will return [1,2]
success = True
if 'comments' in request.GET:
criteria['comments.count'] = int(request.GET['comments']) # {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
if 'project' in request.GET:
#project = Userproject.objects.get(name=self.request.GET['project'])
criteria['project__name'] = request.GET['project']
success = True
if 'sentiment' in request.GET:
criteria['sentiment'] = request.GET['sentiment'] # {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
if 'date_saved' in request.GET:
criteria['date_saved__range'] = (parse(request.GET['date_saved']).date(), last_date) # 'date': {'$gte': int(time.mktime(date_saved.timetuple()))}
success = True
if 'date_created' in request.GET:
criteria['date_created__range'] = (parse(request.GET['date_created']).date(), last_date) # 'date': {'$gte': int(time.mktime(date_saved.timetuple()))}
success = True
if 'source' in request.GET:
source = request.GET['source']
success = True
print(criteria)
vkposts = Vkwallpost.objects.filter(**criteria).order_by("-date_created")#[:5]
fbposts = Fbpagepost.objects.filter(**criteria).order_by("-date_created")#[:5]
if source == 'vk':
items = list(vkposts)
elif source == 'fb':
items = list(fbposts)
else:
items = list(vkposts) + list(fbposts)
items.sort(key=lambda i: i.date_created, reverse=True)
post_list = items
current_page = Paginator(post_list, 20)
# context['post_list'] = items # post_list это VK + FB posts
# vk = VkwallpostFilter(request.GET, queryset=Vkwallpost.objects.all())
# fb = FbpagepostFilter(request.GET, queryset=Fbpagepost.objects.all())
# items = list(vk) + list(fb)
# items.sort(key=lambda i: i.date_created, reverse=True)
return render_to_response('vk_list.html', {'post_list': current_page.page(page_number), 'postfilter_form': postfilter_form,
'project': project, 'date_created': date_created, 'source': source, 'text': text, 'success': success}
, context_instance=RequestContext(request))