2017-10-07 13 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'] = ??? 

あなたはリンゴとマスの数を使用してクエリセットをannotateすることができ、あなたの時間

答えて

2

いただきありがとうございます。

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 

次に、クエリーセットをループすると、注釈付きフィールドにアクセスできます。あなたがあなたのビューからそれを削除することができるかもしれないので、get_context_dataにコンテキストに何かを追加することがありませんでした

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

注意。

+0

ありがとうございます。しかし、私はself.objectに問題があります。 >> AttributeError: 'FIELDVIEW'オブジェクトに 'object'という属性がありません。明白な何かを逃したことがありますか? – TheSadPrinter

+0

申し訳ありませんが、私は前にあなたの質問を誤解し、あなたが特定の果樹園の詳細ビューを持っていると思った。どの果樹園でその結果を知りたいですか?リストのすべての果樹園は? – Alasdair

+0

最終目標はページを持つことです。隣にリンゴの数があるフィールドで。 >>フィールド。りんご。 >> Field1 100 >> field2 200 >>そうです...あなたは私が尋ねたことはまったく正しいですが、self.objectはオブジェクトを返していません。私はそれが起こるようにコードの主要な行を見逃している場合は、ちょうど不思議。 – TheSadPrinter

関連する問題