django过滤器:在一个过滤器中合并2个模型

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

我使用并拥有两个具有相同字段名称的模型,并且两个模型都需要一个筛选表单(对于模型,不是单独的筛选表单,因为对于两个字段,它将变成4个具有相同名称的表单字段)

我现在无法将视图配置为获取模型的合并查询集:

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))