2017-03-02 103 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中的順序。

A similar question已經被問及回答。

您可以簡單地覆蓋管理網站的save_formset,如鏈接所示。

0

翻轉訂單以至極ModelAdmin來電save_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()將返回更新的數據。

相關問題