2016-05-01 6 views
0

このエラーは、 'ステージインスタンスを介してマネージャにアクセスできません。'というエラーが発生します。私はそれを解決しようとしているいくつかの良い時間を過ごしましたが、私は何が間違っているのか分かりません。テンプレートからのコードのDjangoモデルマネージャはモデルインスタンス経由でアクセスできない

models.py

class StageManager(models.Manager): 
    def get_queryset(self): 
     return super(StageManager, self).get_queryset().filter(stage=self.id, stage__zone=self.zone).aggregate(Sum('substage_value')) 


class Stage(models.Model): 
    tablerow_stage = models.ForeignKey(TRStage) 
    stage_value = models.PositiveSmallIntegerField(default=0) 
    slug = models.SlugField(unique=True) 
    zone = models.ForeignKey(Zone) 

    objects = models.Manager() # The default manager 
    subs_objects = StageManager() 

    def __str__(self): 
     return '%s.%s.%s' % (self.zone.project, 
          self.tablerow_stage.stage_num, 
          self.zone.zone_num) 

ライン:

<td style="width:40px" align="center">{{ stage.subs_objects }}</td> 

答えて

1

Djangoは唯一Stage.objects(クラスだけではなく、クラスのインスタンスを経由して)、あなたがstage.objectsを行うことはできません。カスタムクエリーセットは同じルールに従います。しかし、これが許可されても、クエリーセットは機能しません。idzoneなどの参照フィールドは、マネージャではなくモデルインスタンスにのみ存在します。

実際に達成しようとしていることが完全にはわかりませんが、そのクエリーセットを持たずにStageクラスに固執する方法があります。

def substage_sum(self): 
    return self.__class__.objects.filter(
     stage=self.id, 
     stage__zone=self.zone 
    ).aggregate(
     sum=Sum('substage_value') 
    ).values_list('sum', flat=True).first() 

これは、あなたが望むものとして、合計を表す単一の値を返します。

+0

テンプレートからこのsubstage_classにアクセスするにはどうすればよいのですか?ステージオブジェクトごとにsubstage_sumの値にアクセスできますか? – BlueDog

+0

私が記述した方法はあなたのモデルに入れられ、モデルの他のすべてのもの( '{{stage.substage_sum}}')のようなテンプレートからアクセスできます。あなたが正しく達成しようとしていたことを私が推測しなかった場合、あなたはそれを更新する必要があります。 – Anonymous

+0

あなたのコメントのおかげで、しかし私は私のコメントを提出する前にそれを試してみました。私はこのエラー 'フィールド'にキーワード 'ステージ'を解決できません。選択肢は、substage_sumにアクセスしようとすると、id、slug、stage_value、substage、tablerow_stage、tablerow_stage_id、zone、zone_id 'です。 – BlueDog

関連する問題