2017-06-12 9 views
0

私は他のモデルからの外部キーを使用しているモデルを持っています。 また、別の列をその外部キーの対応するフィールドに設定する必要がありますが、これを正しく行う方法がわかりません。外部キーと対応するフィールド値をモデルに取得

私はModelCで設定した関数を使ってModelAのpo_numberと一致するようにしたいのですが、save()関数のモデルBのsku_numberと一致させてください。私は、DBの構造がに似ものにするために取得できますか

Class ModelA(models.Model): 
    po_number = models.CharField(max_length=100) 


Class ModelB(models.Model): 
    model_a = models.ForeignKey(ModelA, on_delete=models.PROTECT 
    Value = models.CharField(max_length=100) 
    sku_number = models.CharField(max_length=100) 

    def calc_received(self): 
     sum_value = ModelC.objects.filter(
      sku_number=self.sku_number 
     ).aggregate(
       value_sum=Sum(F('value')) 
     ) 
      value_received = sum_value['value_sum'] 

      return value_received 


Class ModelC(models.Model): 
    po_number = models.CharField(max_length=100) 
    sku_number = models.CharField(max_length=100) 

    def save(self, *args, **kwargs): 
     super().save(*args, **kwargs) 

     obj = ModelB.objects.get(
      po_number=self.po_number, 
      sku_number = self.sku_number 
     ) 

     obj.value_received = obj.calc_received() 
     obj.save() 

id  ModelA_id  ValueFromA 
_______________________________ 

現在、私は

def _get_valuefromB(self): 
    return self.ModelB.Value 
value = property(_get_valuefromB 
+1

理由はありますかhyは単に 'model_instance_A.ModelB.Value'を使うことはできませんか? –

+0

また、[Djangoのコーディングスタイル](https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/#model-style)には、大文字でフィールド名を付けています。 'Value = ...'は 'value = ...'でなければなりません。 –

答えて

0

をしようとしています、私は右のあなたの質問を理解している場合、あなたはこの

ようなものが必要
class ModelA(models.Model): 
    model_b = models.ForeignKey(ModelB, on_delete=models.PROTECT) 

    @property 
    def value_b(self): 
     return self.model_b.Value 
+0

私が持っている問題は、その列をpostgresに追加するためにマイグレーションに反映されないということです – user2168066

+0

ModelBのValueと常に同じModelAの列が必要ですか? – vZ10

+0

はい、可能ならば – user2168066

関連する問題