2017-08-07 11 views
-1

ネストされたフィールドを変更するモデルメソッドを記述したいモデルインスタンスの複数のフィールドを反復処理するにはどうすればよいですか?

メインモデルに関連するオブジェクトを反復するのに問題があります。特定のコードは次のとおり

def set_si_units(self): 
    self.currently.get_si_units() 
    for i in range(0, self.hourly.data.count()): 
     self.hourly.data[i].get_si_units() 

滞りなくself.currentlyランを変更し、私は変換温度を受ける2行目。ループのためしかし、私に次のエラーを与える:

TypeError: 'RelatedManager' object does not support indexing 

私は本当に私がCurrentlyモデルでやっているように私には、温度を変えることができますので、個別にDataモデルの各インスタンスを反復処理することができるようにしたいと思います。

私は以下の関連コードも含めました。あなたが何か他のものを見る必要があるかどうか私に知らせてください。私のアプローチに関して、どんな助けやフィードバックがあっても大歓迎です!

トレースバック

File "/path_to_project/project/weather/models.py", line 137, in get_si_units 
    self.hourly.data[i] = self.hourly.data[i].get_si_units() 
TypeError: 'RelatedManager' object does not support indexing 
get_si_units()(例えば、現在&データ)と

クラス

class SomeClass(model.Models): 
    temperature = models.FloatField(null=True, blank=True) 
    ... # Other fields 

    def convert_f_to_c(self, temperature_f): 
     ... 

    def get_si_units(self): 
     data_point = self 
     data_point.temperature = self.convert_f_to_c(self.temperature) 
     ... # Convert other fields 
     return data_point 
私は

class Location(models.Model): 
    currently = models.OneToOneField(Currently, on_delete=models.CASCADE) 
    hourly = models.OneToOneField(Hourly, on_delete=models.CASCADE) 
    ... 
    def set_si_units(self): 
     self.currently.get_si_units() 
     for i in range(0, self.hourly.data.count()): 
      self.hourly.data[i].get_si_units() 
にこだわっている

Locationクラス

+0

一般的に、Pythonでは、あなたが何かのサイズの 'range'を反復していると分かっていると、間違っていることが分かります。 –

答えて

0

すべてのオブジェクトを取得してから繰り返し使用できます。

class Location(models.Model): 
    currently = models.OneToOneField(Currently, on_delete=models.CASCADE) 
    hourly = models.OneToOneField(Hourly, on_delete=models.CASCADE) 
    ... 
    def set_si_units(self): 
     self.currently.get_si_units() 
     for hourly_data in self.hourly.data.all(): 
      hourly_data.get_si_units() 
+0

お返事ありがとうございます。前にこのメソッドを試しましたが、 'hourly_data'はローカルインスタンスであり、' self'を変更しません。私はこのようにすることができる方法はありますか?それでも完全な 'Location'オブジェクトを返すのですか? – CudB

+0

オブジェクトを変更したい場合は、新しい値を代入して古いものを代入してください。 –

+0

個々の 'hourly_data'インスタンスをデータベースに保存せずに割り当てる方法が分かりません。私に例を教えてもらえますか? – CudB

関連する問題