2016-09-27 44 views
0

我有兩個模型 - 事件和租戶。Django錯誤,同時保存外鍵 - 不能分配任何,不允許空值

class EventsModel(models.Model): 
    sys_id = models.AutoField(primary_key=True, null=False, blank=True) 
    tenant_sys_id = models.ForeignKey('tenant.TenantModel', on_delete = models.CASCADE, null=False, blank=True) 
    name = models.CharField(max_length=80, null=False, blank=False) 
    start_date_time = models.DateTimeField(null=False, blank=False) 
    end_date_time = models.DateTimeField(null=False, blank=False) 
    created_when = models.DateTimeField(null=False, blank=True) 

    def save(self, *args, **kwargs): 
     self.created_when = timezone.now() 
     self.tenant_sys_id = 1 #for-testing-only. actual current_logged_in_user.tenant_sys_id 
     return super(EventsModel, self).save(*args, **kwargs) 

此模型有一個FK tenant_sys_id租戶模型。如果爲此我設置null = False,則會引發下面的錯誤。

ValueError('Cannot assign None: "EventsModel.tenant_sys_id" does not allow null values.',) 

我保存方法從登錄的用戶設置的詳細資料在重寫此字段的值。 設置null = True不會拋出此錯誤。

但是,我這樣做created_when字段此行爲未顯示。不管null = True/False,值將從保存方法設置並保存。

我在查看文件中出現此錯誤。

form = EventsForm(request.POST) 
print(request.POST) # print 
print(form) # do not print. error here <-- 
if form.is_valid(): # error here if above line is commented. 
    form.save() 

的ModelForm類

class EventsForm(ModelForm): 
    class Meta: 
     model = EventsModel 
     fields = '__all__' 

所以我在這裏無法理解 -
1.爲什麼我必須設置FK爲null = True,並且爲了工作不created_when。
2.爲什麼在創建表單時拋出錯誤,而不是在保存數據時拋出錯誤。

更新: 任何人downvoting問題 - 請ATLEAST再提一下,爲什麼你認爲這個問題沒有以適當的方式詢問意見的原因是什麼?

回答

0

您的外鍵應該叫做tenant_sys而不是tenant_sys_id。 Django會自動將_id後綴添加到底層數據庫字段中,但是您在Python中的值實際上是目標模型的實例,而不是ID。

用你的代碼,你仍然沒有設置數據庫值;你設置的對象,Django實際上將轉換爲tenant_sys_id_id,但db列保持空白,因此完整性錯誤。沒有表單驗證錯誤的原因是因爲字段定義上也有blank=True

+0

感謝您的幫助。我仍然有疑問 - (1)從ModelForm類創建表單對象時發生錯誤,而不是保存方法。 (2)爲什麼它在FK上設置null = True時起作用。 – User42

+0

請看看這個 - https://code.djangoproject.com/ticket/18441 – User42

+0

也是這樣 - https://code.djangoproject.com/ticket/24787。根據這個,我們無法在模型中的FK上使用null = False和blank = True。 – User42