2017-03-02 12 views
0

私は、このようなDjangoのモデルがあります:Djangoのモデルの上書き保存し、関連するオブジェクトからの新しいフィールド値

class Car(models.Model): 
    rating = models.PositiveIntegerField(
     default=0, 
     verbose_name=_('Rating'), 
    ) 

class ReportInfo(models.Model): 
    car = models.ForeignKey(
     Car, 
     related_name='car_info', 
     verbose_name='Report', 
    ) 

をそして私は、このような方法で、レポートからの情報を含む私の車インスタンスの格付けを形成する必要があります。

def save(self, *args, **kwargs): 
    rating = 0 
    for item in self.car_info.all(): 
     rating += 10 
    self.rating = rating 
    super(Car, self).save(*args, **kwargs) 

私は車のすべてのレポートを取得し、次にレポートから他のデータを取得して、フィールドに評価を保存する必要があります。しかし、self.car_info.all()は私に古いデータを返します。それは次のことを意味します。新しい車の管理ページで[保存]ボタンをクリックすると、保存メソッドのコードは実際のレポートにはアクセスできません。

ご理解いただけますか?私に何ができる?

+1

これにはdjangoシグナルを使用できます。 https://docs.djangoproject.com/en/1.10/ref/signals/#post-save –

+0

私は試しましたが、変更はありません –

+0

別の方法があります。あなたの車のモデルを保存した後、あなたは評価を更新することができます.. –

答えて

1

ここでの問題は、Djangoでの保存の順です。

similar questionはすでに尋ねられ、回答されました。

リンクに表示されているように、管理サイトのsave_formsetを単に上書きすることができます。

0

ModelAdminsave_model()save_related()となります。このようにしてModel.save()から、in this postと記載されているように、関連するフィールドの更新値に到達することができます。

class Car(models.Model): 
    ... 

    def save(self, *args, **kwargs): 
     if not self.id: 
      super().save(*args, **kwargs) 
     rating = 0 
     for item in self.car_info.all(): 
      rating += 10 
     self.rating = rating 
     super(Car, self).save(*args, **kwargs) 


class CarAdmin(admin.ModelAdmin): 

    def save_model(self, request, obj, form, change): 
     if not obj.pk: 
      super().save_model(request, obj, form, change) 
     else: 
      pass 

    def save_related(self, request, form, formsets, change): 
     form.save_m2m() 
     for formset in formsets: 
      self.save_formset(request, form, formset, change=change) 
     super().save_model(request, form.instance, form, change) 

ここで、self.car_info.all()は更新されたデータを返します。

関連する問題