2016-09-27 23 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