Django你如何在视图中从另一个模型中获取字段?

时间:2017-10-07 11:07:01

标签: python django django-models django-views

我认为这个问题已经被问了几次,然而,问题及其答案并不是那么清楚。如果您可以使标题或下面的示例更清楚。请做。

实施例: 我有一个果园,在我的果园里,我有苹果树的田地,这些苹果树有苹果。问题是使用我的模型:

  1. 如何获取给定字段中的苹果数量
  2. 在该字段中生成的所有苹果的总质量
  3. 模型

    class Field(models.Model):
       size = models.PositiveIntergerField()
       max_tree_number = models.PositiveIntergerField()
    
    class Tree(models.Model):
       field = models.ForeignKey(Field)
       date_of_planting = models.datefield(editable=False)
       variety = models.CharField(max_length=200)
    
    class Apple(models.Model):
       tree = models.ForeignKey(Tree)
       mass = models.PositiveIntergerField()
    

    查看

    class FieldView(generic.ListView):
       template = '[app_name]/index.html'
    
       def get_context_data(self, **kwargs):
           context = super(FieldView, self).get_context_data(**kwargs)
           context['tree_count'] = Field._meta.model_name
           context['mass'] = ???
           context['apple_count'] = ???
    

    感谢您的时间

1 个答案:

答案 0 :(得分:3)

您可以使用苹果数和质量数量annotate查询集。

from django.db.models import Count, Sum

def get_queryset(self):
    queryset = super(FieldView, self).get_queryset()
    queryset = queryset.annotate(num_apples=Count('tree__apple'), apple_mass=Sum('tree__apple__mass'))
    return queryset

然后,当您遍历查询集时,您可以访问带注释的字段。

{% for obj in object_list %}
  {{ obj.size }}, {{ obj.num_apples }}, {{ obj.apple_mass }}
{% endfor %}

请注意,您无需在get_context_data中向上下文添加任何内容,因此您可以将其从视图中删除。

相关问题