2010-01-21 49 views
0

我更新對象時出現問題。這是型號:django更新 - 已設置的必填字段的更新邏輯

class HourRecord(models.Model): 
    day_of_work = models.PositiveIntegerField(max_length=1) 
    date_of_work = models.DateField(verbose_name='creation date') 
    who_worked = models.ForeignKey(User) 
    project = models.ForeignKey(Project, related_name='hour_record_set', null=True) 

    created_by = models.ForeignKey(User, editable=False, related_name='hour_record_creator') 
    created = models.DateTimeField(auto_now_add=True, editable=False, verbose_name='creation date') 
    modified_by = models.ForeignKey(User, editable=False, related_name='hour_record_modifier') 
    modified = models.DateTimeField(auto_now=True, editable=False) 


    def save(self, request): 
     if not self.id: 
      self.who_worked = request.user 
      self.created_by = request.user 
     self.modified_by = request.user 
     super(HourRecord, self).save() 

created_by字段只應設置爲其新對象。因此,「如果不self.id:」。這工作到現在好。

直到現在我更新的對象是這樣的:

if hrform.is_valid(): 
      hour_record = hrform.save(commit=False) 
      hour_record.save(request) 

但是,當我更新模型這樣我得到一個錯誤:

project = Project.objects.get(id=project_pk) 
hr_object = HourRecord(id=hour_record_pk, day_of_work=weekday, date_of_work=date, who_worked=request.user, project=project) 
hr_object.save(request) 

的錯誤信息是:

Column 'created_by_id' cannot be null 

這對我來說很陌生,因爲created_by列已經設置好了。我在數據庫中檢查過它。在我再次檢查對象更新並將created_by_id設置爲null之後,出現此錯誤消息。其實這很奇怪。我收到一條錯誤消息+該行已更新。

第二種方法是從json數據處理視圖中調用的。但我認爲這與它沒有任何關係。我想我可以繞過這個問題,當我重置created_by_id,但這不是我想要做的,因爲它破壞了這個created_by字段的邏輯。

hr_object = HourRecord(id=hour_record_pk,... 

所以,當你到了save()方法,它會檢查它是否有一個ID:

回答

1

那麼,當你實例化HourRecord對象的問題似乎是,你是明確設置id領域。 ..它的確如此,所以它沒有設置who_workedcreated_by

我想知道爲什麼你需要設置ID。通常,您應該讓數據庫通過自動增量自動設置它。

(不涉及您的問題,但你的save方法應該接受force_updateforce_insert參數,並將它們傳遞到超級方法。要做到這一點最簡單的方法是進入來推翻時,總是使用*args, **kwargs的習慣法)

編輯:要回答你爲什麼這並不像一個更新語句工作的問題,這是因爲你明確地用一個新的替換舊的對象。實際上,您正在刪除舊的數據庫條目並插入一組全新的數據。例如,Python無法知道您是想保留一個字段的舊值,還是將其設置爲NULL。

正如您所指出的那樣,執行此操作的方法是獲取現有對象並明確更新其屬性。

+0

我想更新/覆蓋對象。因此,我將該ID提供給模型構造函數。這是錯誤的方法?我遵循django文檔的方法:http://docs.djangoproject.com/en/dev/ref/models/instances/#explicitly-specifying-auto-primary-key-values – 2010-01-21 12:23:39

+0

這很好,但在那在實例化對象時,您還需要自動設置'created_by',因爲它不會在'save'方法中完成。 – 2010-01-21 12:47:19

+0

好吧,但我只是想知道爲什麼它行爲不像一個SQL更新語句。我也不是sql的專家,但我認爲update語句只更新提供的字段並保留其他字段。這是我所期望的。有沒有Django等同於這種行爲? – 2010-01-21 12:58:20