【问题标题】:DRY creation of multiple QuerysetsDRY 创建多个查询集
【发布时间】:2012-11-22 10:28:44
【问题描述】:

我开始使用 Django,虽然我已经阅读了这本书并在谷歌上搜索了一下,但我担心我并没有在某些概念上建立联系以解决这个问题。

我需要显示与特定公司相对应的几个值。用户首先选择三个公司进行比较,然后响应显示这些公司的数据。

在我看来,我创建了我在模板中迭代的查询集,以如下所示显示数据:

观点摘录:

        C1 = form.cleaned_data['Company1']
        C2 = form.cleaned_data['Company2']
        C3 = form.cleaned_data['Company3']

        company_names = [C1,C2,C3]

        company1 = (Company_stats.objects.filter(period__exact=P, company_name__exact=C1))
        company2 = (Company_stats.objects.filter(period__exact=P, company_name__exact=C2))
        company3 = (Company_stats.objects.filter(period__exact=P, company_name__exact=C3))

        company_list = [company1,company2,company3]

模板摘录:

  {%for c in company_list%}    
     {%for z in c %}
        {{ z.company_name }}
        {{ z.nxt_m_ret_est }}    
        {{ z.nxt_m_ret_rat }}
     {% endfor %}  
  {% endfor %}

这行得通 - 但是,由于我有更多的移动部件(为了我的问题,我已经简化了视图)它变成了无穷无尽的查询集洗衣清单 - 我 100% 确定这不是 DRY(尽管洗衣参考;)更不用说上下文的长度了。

如果有人能帮助我学会以正确的方式做到这一点,我将不胜感激。非常感谢您!

【问题讨论】:

    标签: django filter dry django-queryset


    【解决方案1】:

    我还要补充一点,千篇一律的查询是Managers 真正闪耀的地方。如果您发现也需要在代码的其他地方进行相同的查询,请绝对考虑使用它们。我暂时避开了它们,因为我认为它们很复杂,但它们真的不是那么糟糕,它们可以清理你的代码很多。

    【讨论】:

    • 谢谢你,acjohnson55!我一定会看看经理。
    【解决方案2】:

    试试这个:

    companies = ['Company1', 'Company2', 'Company3']
    
    company_names = [form.cleaned_data[c] for c in companies]
    
    company_list = Company_stats.objects.filter(
        period__exact=P, 
        company_name__in=company_names
    )
    

    即使这不完全符合您的需要,类似的东西应该可以工作。

    【讨论】:

    • 是的!非常感谢您的帮助:) 以及如此迅速的回复。很抱歉,我花了一些时间来测试 - 我不得不在我的纠缠视图中重新创建它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 2011-05-17
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多