我更新對象時出現問題。這是型號: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:
我想更新/覆蓋對象。因此,我將該ID提供給模型構造函數。這是錯誤的方法?我遵循django文檔的方法:http://docs.djangoproject.com/en/dev/ref/models/instances/#explicitly-specifying-auto-primary-key-values – 2010-01-21 12:23:39
這很好,但在那在實例化對象時,您還需要自動設置'created_by',因爲它不會在'save'方法中完成。 – 2010-01-21 12:47:19
好吧,但我只是想知道爲什麼它行爲不像一個SQL更新語句。我也不是sql的專家,但我認爲update語句只更新提供的字段並保留其他字段。這是我所期望的。有沒有Django等同於這種行爲? – 2010-01-21 12:58:20