【问题标题】:Django - Accessing sublist of list in for loopDjango - 在for循环中访问列表的子列表
【发布时间】:2017-11-06 12:32:02
【问题描述】:

我有一个查询以下列格式输出数据:

[["W/E 6/11/17", "Carter, J", 40.0],
 ["W/E 6/18/17", "Carter, J", 40.0],
 ["W/E 6/11/17", "Linn, K", 27.0],
 ["W/E 6/18/17", "Linn, K", 27.0],
 ["W/E 6/11/17", "Massey, S", 55.0],
 ["W/E 6/18/17", "Massey, S", 45.0]]

我的查询:

emp3 = (
    Projectsummaryplannedhours.objects.values(
        'employeename', 'displayval')
    .order_by()
    .filter(businessunit='a')
    .filter(billinggroup__startswith='PLS - Pip')
    .filter(Q(displayval=sunday2)|Q(displayval=sunday))
    .annotate(plannedhours__sum=Sum('plannedhours'))
)

在我的模板中,我目前正在使用 for 循环,但它返回列表中的所有项目,而不仅仅是列表的第一个列表。

{% for x in emp3 %}
{{x.employeename}}
{{x.plannedhours__sum}}

我想做的是遍历列表并以水平形式显示 Employee: Value for W/E 6/11, Value for W/E 6/18。

型号:

class Projectsummaryplannedhours(models.Model):
    number = models.CharField(db_column='Number', max_length=50, blank=True, null=True)  # Field name made lowercase.
    description = models.CharField(db_column='Description', max_length=100, blank=True, null=True)  # Field name made lowercase.
    clientname = models.CharField(db_column='ClientName', max_length=100, blank=True, null=True)  # Field name made lowercase.
    department = models.CharField(db_column='Department', max_length=50, blank=True, null=True)  # Field name made lowercase.
    billinggroup = models.CharField(db_column='BillingGroup', max_length=50, blank=True, null=True)  # Field name made lowercase.
    businessunit = models.CharField(db_column='BusinessUnit', max_length=50, blank=True, null=True)  # Field name made lowercase.
    employeename = models.CharField(db_column='EmployeeName', max_length=50, blank=True, null=True)  # Field name made lowercase.
    displayval = models.CharField(db_column='DisplayVal', max_length=50, blank=True, null=True)  # Field name made lowercase.
    startofweek = models.DateTimeField(db_column='StartOfWeek', blank=True, null=True)  # Field name made lowercase.
    endofweek = models.DateTimeField(db_column='EndOfWeek', blank=True, null=True)  # Field name made lowercase.
    plannedhours = models.DecimalField(db_column='PlannedHours', max_digits=10, decimal_places=5, blank=True, null=True)  # Field name made lowercase.
    rateschedule = models.CharField(db_column='RateSchedule', max_length=50, blank=True, null=True)  # Field name made lowercase.
    classification = models.CharField(db_column='Classification', max_length=50, blank=True, null=True)  # Field name made lowercase.
    dollarsforecast = models.DecimalField(db_column='DollarsForecast', max_digits=10, decimal_places=5, blank=True, null=True)  # Field name made lowercase.
    deleted = models.NullBooleanField(db_column='Deleted')  # Field name made lowercase.
    datelastmodified = models.DateTimeField(db_column='DateLastModified', blank=True, null=True)  # Field name made lowercase.
    datecreated = models.DateTimeField(db_column='DateCreated', blank=True, null=True)  # Field name made lowercase.

更新查询:

emp3_list = Projectsummaryplannedhours.objects.values('employeename', 'displayval').order_by().filter(businessunit='a').filter(billinggroup__startswith='PLS - Pip').filter(Q(displayval=sunday2)|Q(displayval=sunday)).annotate(plannedhours__sum=Sum('plannedhours'))
emp3 = map(lambda x: {'date': x[0], 'employee_name': x[1], 'planned_hours': x[2]}, emp3_list)

我尝试过的每个查询:

def DesignHubR(request):
#emp1 = Projectsummaryplannedhours.objects.filter(employeename__startswith='Linn').values_list('endofweek').annotate(plannedhours__sum=Sum('plannedhours'))

day = datetime.datetime.today()
start = day - timedelta(days=day.weekday())
s1 = start + timedelta(days=6)
day2 = day + + timedelta(days=7)
start2 = day2 - timedelta(days=day.weekday())
s2 = start2 + timedelta(days=6)
sunday = datetime.datetime.strftime(s1, "W/E %#m/%#d/%y")
sunday2 = datetime.datetime.strftime(s2, "W/E %#m/%#d/%y")
employee = Projectsummaryplannedhours.objects.order_by().values_list('employeename', flat=True).distinct().filter(businessunit='a').filter(billinggroup__startswith='PLS - Pip')
emp1 = Projectsummaryplannedhours.objects.values_list('displayval', 'employeename').filter(businessunit='a').filter(billinggroup__startswith='PLS - Pip').filter(displayval=sunday).annotate(plannedhours__sum=Sum('plannedhours'))
emp4 = Projectsummaryplannedhours.objects.filter(employeename__startswith='Linn').filter(Q(displayval=sunday2)|Q(displayval=sunday)).annotate(plannedhours__sum=Sum('plannedhours'))
emp2 = Projectsummaryplannedhours.objects.values_list('displayval', 'employeename').filter(businessunit='a').filter(billinggroup__startswith='PLS - Pip').filter(Q(displayval=sunday2)|Q(displayval=sunday)).annotate(plannedhours__sum=Sum('plannedhours'))
emp3_list = Projectsummaryplannedhours.objects.values_list('displayval', 'employeename').filter(businessunit='a').filter(billinggroup__startswith='PLS - Pip').filter(Q(displayval=sunday2)|Q(displayval=sunday)).annotate(plannedhours__sum=Sum('plannedhours'))
emp3 = map(lambda x: {'date': x[0], 'employee_name': x[1], 'planned_hours': x[2]}, emp3_list)
context = {'emp1': emp1, 'emp2': emp2, 'sunday2': sunday2, 'employee': employee, 'emp3': emp3, 'emp4': emp4}
return render(request,'department_hub_ple.html', context)

【问题讨论】:

  • 如何将列表发送到模板上下文?
  • 我不清楚你想要什么。查询输出正确还是您想要正确的部分?
  • context = {'emp3': emp3} 然后渲染上下文
  • @Jérôme 查询输出是正确的,除非我需要另一个输出来在我的模板中获得所需的结果。我刚刚发布了查询输出,所以我输出的数据会很清楚。
  • 请注意,多次调用filter() 最终会筛选出匹配一个或多个条件的对象。这是你所期待的吗? stackoverflow.com/questions/8164675/…

标签: python django


【解决方案1】:

您可以通过以下方式使用列表索引:

{{ x.0 }}

所以你的模板可能看起来像(没有任何标记或样式):

{% for x in emp3 %}
  {{ x.1 }}
  {{ x.2 }}
{% endfor %}

Docs on Variables and Lookups

编辑

如果您正在寻找一种仅使用列表列表中的列表的方法,您可以链接查找。以下示例将给出第一个列表的第二个元素。

{{ x.0.1 }}

这可能会使您的模板更难阅读,因为在您的上下文中x.0.1 指的是什么并不是很清楚。您可能会考虑更改结果的数据结构,并将视图返回的数据限制为模板将要使用的数据。

编辑 2

为了使您的模板更具可读性,请使用map 函数将您的列表列表转换回字典列表:

emp3_list = [
    ["W/E 6/11/17", "Carter, Jon", 40.0],
    ["W/E 6/18/17", "Carter, Jon", 40.0],
    ["W/E 6/11/17", "Linn, Kenneth", 27.0],
    ["W/E 6/18/17", "Linn, Kenneth", 27.0],
    ["W/E 6/11/17", "Massey, Smiley", 55.0],
    ["W/E 6/18/17", "Massey, Smiley", 45.0]
]
emp3 = map(lambda x: {'date': x[0], 'employee_name': x[1], 'planned_hours': x[2]}, emp3_list)

您的模板将如下所示:

{% for x in emp3 %}
    Employee: {{ x.employee_name }}
    Date: {{ x.date }}
    Planned Hours: {{ x.planned_hours }}
{% endfor %}

【讨论】:

  • x.0, x.1 不适用于 .values,仅适用于 values_list。我曾尝试使用值列表,但它同时返回两个列表,我想将其定义为只返回一个列表。
  • 正如文档所述,模板引擎尝试以三种不同的方式解释x.0:通过dict 键查找,然后attribute 查找,然后list-index。没错,它不适用于.values(),因为它返回dicts 的列表。但是,这并不意味着这种语法也不适用于列表索引。你试过我的建议了吗?
  • 感谢您的回复。是的,我尝试过使用 values_list 和 values。使用 values_list 时,我可以使用 .0、.1 等,它返回该变量的所有值。所以我有 [[1,2,3],[4,5,6]]。使用 x.0 返回 1,4。我想只返回 1 个或 4 个。
  • 已编辑以解决您的评论。
  • 我明白你的意思。所以 {{x.0.1}} 在 for 循环中不起作用。它只是调用列表的各个部分。
猜你喜欢
  • 2016-09-04
  • 2020-07-30
  • 1970-01-01
  • 2017-02-18
  • 2015-12-26
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
相关资源
最近更新 更多