2015-05-20 124 views
0

我正在通过一些教程学习django,目前在effective-django教程中拥有所有权。不幸的是,这些教程是为旧版本的django编写的,所以有些东西稍有不同。django:不可空字段的默认值

我在models.py添加一个“所有者”字段时,我的模型跟遇到了问题:

from django.db import models 
from django.core.urlresolvers import reverse 
from django.contrib.auth.models import User 

class Contact(models.Model): 
    """ 
     Interface for contact class 
    """ 
    first_name = models.CharField(max_length=255) 
    last_name = models.CharField(max_length=255) 
    email = models.EmailField() 
    owner = models.ForeignKey(User) 

    def __str__(self): 
     return ' '.join([self.first_name, self.last_name]) 

    def get_absolute_url(self): 
     return reverse('contacts-view', kwargs={'pk': self.id}) 

当试图运行“makemigrations”,我得到警告:

您尝试添加不可为空场“所有者”没有默认联系:不能这样做

这使得现有数据库的意义,所以我尝试冲洗ŧ他数据库。但是,问题依然存在。现场所有者的默认值是什么?我也尝试让字段为空,但是这给了我字段所有者不能为空的错误。

回答

1

我通常设置为1。在这种情况下,已经存在的记录将被分配给第一个用户。

如果您希望稍后可以在下一次数据迁移中重新分配这些记录。

+0

添加这确实解决了这个问题,这确实对后来添加的联系人是否有影响? – nluigi

+1

不,新添加的联系人不会有该字段的任何默认值。此值将仅设置为迁移时数据库中存在的记录。 – catavaran

1

那么,数据库是否为空并不重要。重要的是,您可能已经至少有一次首次创建模型的迁移,然后尝试运行添加该字段的makemigrations

如果这些迁移对您来说不是太重要(我认为它们不是因为这是一个教程),只需删除所有先前的迁移并运行新鲜的迁移。

或者,你就必须手动更改迁移,可能提供一个默认值等

+0

确定但当我删除所有迁移并重置数据库,我仍然收到警告'contacts_contact.owner_id可能不为空' – nluigi