2014-01-12 21 views
0

我想用AbstractUser組件擴展用戶模型。但我在這方面還沒有取得成功。經過重新研究後,我編寫了我的模型Employee(擴展用戶模型),但現在當我執行syncdb時,出現以下錯誤。Python Django - 在創建模型時獲取錯誤 - 使用AbstractUser擴展用戶模型

如果任何人都可以通過建議或運行我的models.py來幫助我,那會很棒。當我運行syncdb時,它會要求超級用戶創建後我給我的憑據我得到一個下面的錯誤。

Error : (Complete traceback is pasted after the models.py) 

return Database.Cursor.execute(self, query, params) 
django.db.utils.IntegrityError: epi_employee.emp_id may not be NULL 



My models.py 

from django.db import models 
from django.contrib.auth.models import AbstractUser 
from django.conf import settings 

# Create your models here. 

class Employee(AbstractUser): 
    emp_id = models.IntegerField('Employee Id', max_length=5,unique=True) 
    dob = models.DateField('Date of Birth', null=True,blank=True) 

    def __unicode__(self): 
     return self.get_full_name 


class Department(models.Model): 
    name = models.CharField('Department Name',max_length=30, unique=True,default=0) 
    def __unicode__(self): 
     return self.name 


class Report(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    dept = models.ForeignKey(Department, verbose_name="Department") 
    report1 = models.ForeignKey(Employee,null=True,blank=True, verbose_name=u'Primary Supervisor',related_name='Primary') 
    report2 = models.ForeignKey(Employee,null=True,blank=True, verbose_name=u'Secondary Supervisor',related_name='Secondary') 

    def __unicode__(self): 
     return self.user 

def upload_to(instance, filename): 
    return 'images/%s/%s' % (instance.user.username, filename) 

class thumbnail((models.Model)): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    image = models.ImageField('Profile Pic',null=True, blank=True, upload_to=upload_to) 

    def __unicode__(self): 
     return self.user 


class Passport(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    passport = models.CharField('Passport Number',max_length=15) 
    passportissue = models.CharField('Issuing City',max_length=15, default='Bangalore') 
    passportcountry = models.CharField('Issuing City',max_length=15, default='India') 
    passportstart = models.DateField('Valid From', null=True,blank=True) 
    passportend = models.DateField('Valid Till', null=True,blank=True) 

    def __unicode__(self): 
     return self.user 


class CurrentAddress(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL) 
    address = models.TextField('Current Address') 
    city = models.CharField('City', max_length=20, default = 'Bangalore') 
    state = models.CharField('State', max_length=20, default= 'Karnataka') 
    country = models.CharField('Country', max_length=20, default = 'India') 
    mobile1 = models.IntegerField('Mobile1',max_length=12) 
    mobile2 = models.IntegerField('Mobile2', null=True, blank=True, max_length=12) 
    landline = models.IntegerField('Land Line',null=True, blank=True, max_length=12) 
    email = models.EmailField('Personal Email Id', blank=True) 

    def __unicode__(self): 
     return self.user 

COMPLETE TRACE BACK:請找到我所得到的完整錯誤。讓我知道,如果需要更多的信息

(testenv1) F:\djangoenv\testenv1\employee>python manage.py syncdb 
Creating tables ... 
Creating table django_admin_log 
Creating table auth_permission 
Creating table auth_group_permissions 
Creating table auth_group 
Creating table django_content_type 
Creating table django_session 
Creating table epi_employee_groups 
Creating table epi_employee_user_permissions 
Creating table epi_employee 
Creating table epi_department 
Creating table epi_report 
Creating table epi_thumbnail 
Creating table epi_passport 
Creating table epi_currentaddress 

You just installed Django's auth system, which means you don't have any superuse 
rs defined. 
Would you like to create one now? (yes/no): yes 
Username: admin 
Email address: [email protected] 
Password: 
Password (again): 
Traceback (most recent call last): 
    File "manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\__init__. 
py", line 399, in execute_from_command_line 
    utility.execute() 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\__init__. 
py", line 392, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\base.py", 
line 242, in run_from_argv 
    self.execute(*args, **options.__dict__) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\base.py", 
line 285, in execute 
    output = self.handle(*args, **options) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\base.py", 
line 415, in handle 
    return self.handle_noargs(**options) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\commands\ 
syncdb.py", line 112, in handle_noargs 
    emit_post_sync_signal(created_models, verbosity, interactive, db) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\sql.py", 
line 216, in emit_post_sync_signal 
    interactive=interactive, db=db) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\dispatch\dispatcher.py", 
line 185, in send 
    response = receiver(signal=self, sender=sender, **named) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\contrib\auth\management\_ 
_init__.py", line 126, in create_superuser 
    call_command("createsuperuser", interactive=True, database=db) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\__init__. 
py", line 159, in call_command 
    return klass.execute(*args, **defaults) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\core\management\base.py", 
line 285, in execute 
    output = self.handle(*args, **options) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\contrib\auth\management\c 
ommands\createsuperuser.py", line 141, in handle 
    self.UserModel._default_manager.db_manager(database).create_superuser(**user 
_data) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\contrib\auth\models.py", 
line 195, in create_superuser 
    **extra_fields) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\contrib\auth\models.py", 
line 186, in _create_user 
    user.save(using=self._db) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\base.py", line 
545, in save 
    force_update=force_update, update_fields=update_fields) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\base.py", line 
573, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, upda 
te_fields) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\base.py", line 
654, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\base.py", line 
687, in _do_insert 
    using=using, raw=raw) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\manager.py", li 
ne 232, in _insert 
    return insert_query(self.model, objs, fields, **kwargs) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\query.py", line 
1511, in insert_query 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\models\sql\compiler.py 
", line 898, in execute_sql 
    cursor.execute(sql, params) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\backends\util.py", lin 
e 69, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\backends\util.py", lin 
e 53, in execute 
    return self.cursor.execute(sql, params) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\utils.py", line 99, in 
__exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\backends\util.py", lin 
e 53, in execute 
    return self.cursor.execute(sql, params) 
    File "F:\djangoenv\testenv1\lib\site-packages\django\db\backends\sqlite3\base. 
py", line 450, in execute 
    return Database.Cursor.execute(self, query, params) 
django.db.utils.IntegrityError: epi_employee.emp_id may not be NULL 

回答

1

您定義emp_idunique但不nullable,您可以添加null=True到模型中,但似乎是你想用emp_id作爲primari_key,所以要確保字段不能爲空,且必須是唯一的,你是他要使用一個models.AutoField

emp_id = models.AutoField(primary_key=True) 

這保證字段是唯一的不能爲空。現在

,爲max_length財產和模型的名稱(Employee)我認爲emp_id將是一個數量,該公司給你,比如我的ID在公司,我的工作是0001544,所以要避免這個問題你可以創建自定義管理:

from django.contrib.auth.models import BaseUserManager 


class EmployeManager(BaseUserManager): 
    def create_user(self, username, email,emp_id, password=None): 
     if not username: 
      raise ValueError('Employers must have an username.') 
     if not email: 
      raise ValueError('Employers must have an email address.') 
     if not emp_id: 
      raise ValueError('Employers must have an employer id') 
     user = self.model(username=username, email=self.normalize_email(email), emp_id=emp_id) 
     user.set_password(password) 
     user.save(using=self._db) 
     return user 

    def create_superuser(self, username, email, emp_id, password): 
     user = self.create_user(username, email, emp_id, password) 
     user.is_admin = True 
     user.is_superuser = True 
     user.save(using=self._db) 
     return user 

,然後在模型文件里加入:

from myapp.managers import EmployeManager 

和你的屁股Employers Model

objects = EmployeManager() 

然後運行python manage.py syncdb

希望這可以幫助你,有任何疑問,請告訴我。

+0

感謝您的詳細解釋。對不起,我是新來的Django對此表示歉意:(我嘗試過null = True它沒有工作更早 1.如果你看到我的models.py我已經把用戶作爲外鍵在我所有的模型 user = models.ForeignKey(settings.AUTH_USER_MODEL) 現在如果我遵循你的方法,我是否需要更改ForeignKey constarint? 2.我的Employee Model只有objects = EmployeManager(),或者它也會有字段(emp_id和dob)?我不想給AutoIncrement添加emp_id字段 3.我在哪裏創建這個customManager?它與null = True是否在相同的models.py? – just10minutes

+0

中,必須工作,1.-您不需要更改foreignKey,2.-您的模型將包含fields和objects = EmployeManager(),3.-在同一級別創建一個名爲managers.py的文件an models.py –

+0

Awesome Victor,感謝您的解釋,我需要一些時間來測試這個。我想它應該爲我工作。一旦它起作用,我就接受爲答案。 – just10minutes

1

您定義emp_idunique但不能爲空。

所以當你創建超級用戶時,django提出emp_id不能爲空。

如果你想它作爲主鍵刪除該字段。 如果你想定義它後,把在外地EMP_ID null=True

反正你可以在這裏閱讀https://docs.djangoproject.com/en/dev/topics/db/models/#automatic-primary-key-fields

附:我看到另一個錯誤:

self.get_full_name() 

但是,這是超級行爲,所以你可以刪除它。

+0

感謝您的回覆,我會試試這個,讓你知道如果我成功 – just10minutes