2017-10-07 134 views
0

我想这个问题已经被问了几次了,但是,这些问题和他们的答案并不明确。如果你可以让标题或下面的例子更清晰。请做。Django如何从视图中的另一个模型获取字段?

例如: 我有一个果园,在我的果园里我有苹果树的领域,这些苹果树有苹果。现在的问题是用我的模型:

  1. 我如何才能在某一领域苹果数量?
  2. 该给定区域生产的所有苹果的总质量

型号

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'] = ??? 

谢谢您的时间

回答

2

您可以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,所以你可能能够从您的视图中删除。

+0

感谢您的帮助,但是我遇到了self.object问题。 >> AttributeError:'FIELDVIEW'对象没有属性'object'。我错过了明显的东西吗? – TheSadPrinter

+0

对不起,我之前误解了你的问题,并认为你有一个特定的果园详细视图。你想知道哪个果园的结果?列表中的每个果园? – Alasdair

+0

最终目标是建立一个页面。与该领域与旁边的苹果数量。 >>字段。苹果。 >> Field1 100 >> field2 200 >>等等...你完全正确的问我,但self.object没有返回一个对象。只是想知道是否缺少任何关键代码来实现它。 – TheSadPrinter

相关问题