按关键字过滤数据库中的对象

Filtering Objects in Database by Keyword

我正在使用 Django 1.8.3 和 Python 3.4.3

我会尽量解释清楚,所以请多多包涵。我已经将一个 csv 文件导入到我的数据库中,其中包含大约 50 行和 10 列的数据,其中包括从 Google Analytics 和我们的电子邮件营销活动数据中提取的数据。其中一列是 'day_of_week'。我需要计算具有我需要的当天关键字的数据库行数......我唯一能弄清楚如何做到这一点的方法是使用下面的代码,但是伙计,它看起来确实可以更动态和清洁剂。

有没有办法以我可以在模板中使用标签的方式过滤它,或者比这更干净的东西?感谢您的帮助。

class EmailListView(ListView):
    model = Email
    template_name = 'dashboard/pages/email.html'

    def get_context_data(self, **kwargs):
        context = super(EmailListView, self).get_context_data(**kwargs)
        days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
        months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October',
                  'November', 'December']
        subject_type = ['Offer', 'Sell', 'Fear', 'Learn']
        content_type = ['Offer', 'Sell', 'Fear', 'Learn']
        email_list = ['FMG - Business', 'FMG - Residential', 'AE', 'IBA']

        total_campaigns_monday = {}
        total_campaigns_tuesday = {},
        total_campaigns_wednesday = {},
        total_campaigns_thursday = {},
        total_campaigns_friday = {},
        total_campaigns_saturday = {},
        total_campaigns_sunday = {},
        total_recipients = {}
        total_unsubscribes = {}
        total_bounces = {}
        total_open = {}
        total_clicks = {}

        for campaigns in days:
            total_campaigns_monday = Email.objects.filter(day_of_week='Monday').count()
            total_campaigns_monday = Email.objects.filter(day_of_week='Tuesday').count()
            total_campaigns_monday = Email.objects.filter(day_of_week='Wednesday').count()
            total_campaigns_monday = Email.objects.filter(day_of_week='Thursday').count()
            total_campaigns_monday = Email.objects.filter(day_of_week='Friday').count()
            total_campaigns_monday = Email.objects.filter(day_of_week='Saturday').count()
            total_campaigns_monday = Email.objects.filter(day_of_week='Sunday').count()

还有我的模板片段(请注意第一个与其他模板不同。)

{% if email_list %}
<tr>
   <td>Monday</td>
   <td>{{ total_campaigns_monday }}</td>
   <td>{{ total_recipients.Monday }}</td>
   <td>{{ total_unsubscribes.Monday  }}</td>
   <td>{{ total_bounces.Monday  }}</td>
   <td>{{ total_open.Monday  }}</td>
   <td>{{ total_clicks.Monday  }}</td>
   <td>{% average total_open.Monday total_recipients.Monday %}</td>
   <td>{% average total_clicks.Monday total_open.Monday %}</td>
   </tr>
{% endif %}

希望我理解了你的问题。

替换total_campaigns_<day_of_week>语句和for循环
total_campaigns = {}
for day in days:
    total_campaigns[day] = Email.objects.filter(day_of_week=day).count()

在模板中,您可以使用 {{ total_campaigns.Monday }}{{ total_campaigns.Sunday }} 或类似的东西。

您可以在一个查询中使用 aggregation methods:

from django.db.models import Count
days_and_counts = Email.objects.values('day_of_week').annotate(count=Count('day_of_week'), distinct=True)

会在 days_and_counts 中给你这样的东西(来自我随机填充的数据集的输出):

[
    {'day_of_week': 'Friday', 'count': 7},
    {'day_of_week': 'Monday', 'count': 5},
    {'day_of_week': 'Saturday', 'count': 2},
    {'day_of_week': 'Sunday', 'count': 12},
    {'day_of_week': 'Thursday', 'count': 11},
    {'day_of_week': 'Tuesday', 'count': 6},
    {'day_of_week': 'Wednesday', 'count': 7}
]

从那里,你可以像 f43d65 建议的那样构建一个字典:

total_campaigns = {x['day_of_week']: x['count'] for x in days_and_counts}

这会在 total_campaigns 中给你这样的东西:

{
    'Wednesday': 7,
    'Thursday': 11,
    'Tuesday': 6,
    'Monday': 5,
    'Saturday': 2,
    'Sunday': 12,
    'Friday': 7
}

是的,你可以更干净:

        days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

        total_campaigns = {
            day:Email.objects.filter(day_of_week=day).count()
            for day in days
        }

我建议检查字典理解