我需要创建具有不同权限和层次结构的多种类型的用户。所有用户都是Employee,并且有一个开发管理员类型是一种超级用户,一个Supervisor可以控制多个Driver,还有一个controller是独立用户。我创建了一个扩展的 User Employee 和不同的模型,这些模型从它继承了主要的公共字段。但我收到关于我使用的模型的错误。这是我在 models.py 中的模型定义:
from django.db import models
from django.contrib.gis.db import models
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.gis.db import models as gis_models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
from .managers import EmployeeManager
class Employee(AbstractBaseUser, PermissionsMixin):
first_name = models.CharField(max_length=128, blank=False, null=False)
last_name = models.CharField(max_length=128, blank=False, null=False)
registration_number = models.PositiveSmallIntegerField(unique=True, blank=False, null=False)
email = models.EmailField()
cni = models.CharField(max_length=18, blank=True)
picture = models.ImageField(upload_to='DriversPictures/', max_length=100, blank=True)
matricule_cnss = models.PositiveIntegerField(blank=True)
driving_licence = models.PositiveIntegerField(blank=True)
recruitment_date = models.DateField(auto_now=False, auto_now_add=False, blank=True)
phone = PhoneNumberField(blank=True, help_text='numéro de telephone')
adress = models.CharField(max_length=128, blank=True)
city_id = models.ForeignKey('City', blank=True, null=True, on_delete=models.SET_NULL)
region_id = models.ForeignKey('Region', blank=True, null=True, on_delete=models.SET_NULL)
# user = models.OneToOneField(User, on_delete=models.CASCADE)
# roles = models.ManyToManyField('Role')
is_exploitation_admin = models.BooleanField(default=False)
is_supervisor = models.BooleanField(default=False)
is_controlor = models.BooleanField(default=False)
is_driver = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
vehicle_id = models.ForeignKey('Vehicle', blank=True, null=True, on_delete=models.SET_NULL)
USERNAME_FIELD = 'registration_number'
REQUIRED_FIELDS = ['first_name', 'last_name', 'email']
objects = EmployeeManager()
def __str__(self):
return (self.registration_number, self.first_name, self.last_name)
class Supervisor(Employee):
zone_name = models.CharField(max_length=128, blank=True)
class Driver(Employee):
supervisor_id = models.ForeignKey('Supervisor', on_delete=models.CASCADE)
projects = models.ManyToManyField('Client', through='ProjectFleet')
class Controlor(Employee):
supervisor_id = models.ForeignKey('Supervisor', blank=True, null=True, on_delete=models.SET_NULL)
gaz_station_id = models.ForeignKey('GazStation', blank=True, null=True, on_delete=models.SET_NULL)
和admin.py我想让registration_number成为身份验证的唯一字段,
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .forms import EmployeeCreationForm, EmployeeChangeForm
from .models import Employee
class EmployeeAdmin(UserAdmin):
add_form = EmployeeCreationForm
form = EmployeeChangeForm
model = Employee
list_display = ('email', 'is_active', 'is_exploitation_admin', 'is_supervisor', 'is_controlor', 'is_driver',)
list_filter = ('registration_number', 'email', 'is_active', 'is_exploitation_admin', 'is_supervisor', 'is_controlor', 'is_driver',)
fieldsets = (
(None, {'fields': ('registration_number', 'email', 'password')}),
('Permissions', {'fields': ('is_active', 'is_exploitation_admin', 'is_supervisor', 'is_controlor', 'is_driver')}),
)
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('registration_number', 'email', 'password1', 'password2', 'is_active', 'is_exploitation_admin', 'is_supervisor', 'is_controlor', 'is_driver')}
),
)
search_fields = ('email','registration_number', 'first_name','last_name')
ordering = ('registration_number', 'last_name')
admin.site.register(Employee, EmployeeAdmin)
manager.py是:
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _
class EmployeeManager(BaseUserManager):
def create_user(self, first_name, last_name, password, **extra_fields):
if not last_name:
raise ValueError(_('Le nom est obligatoire'))
if not first_name:
raise ValueError(_('Le prenom est obligatoire'))
user = self.model(first_name=first_name, last_name=last_name **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, first_name, last_name, mail, password, **extra_fields):
extra_fields.setdefault('is_exploitation_admin', True)
extra_fields.setdefault('is_supervisor', True)
extra_fields.setdefault('is_controlor', True)
extra_fields.setdefault('is_driver', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError(_('Superuser must have is_staff=True.'))
if extra_fields.get('is_superuser') is not True:
raise ValueError(_('Superuser must have is_superuser=True.'))
return self.create_user(first_name, last_name, email, password, **extra_fields)
当我第一次尝试进行迁移时,出现此错误:
(myEnv) mohammed@Laptop:~/Projects/Transport_Project$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying admin.0001_initial...Traceback (most recent call last):
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "Drivers_App_Management_employee" does not exist
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "manage.py", line 22, in <module>
main()
File "manage.py", line 18, in main
execute_from_command_line(sys.argv)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/core/management/base.py", line 85, in wrapped
res = handle_func(*args, **kwargs)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 245, in handle
fake_initial=fake_initial,
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 117, in migrate
state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/executor.py", line 229, in apply_migration
migration_recorded = True
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 115, in __exit__
self.execute(sql)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/base/schema.py", line 142, in execute
cursor.execute(sql, params)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/utils.py", line 98, in execute
return super().execute(sql, params)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/utils.py", line 66, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "Drivers_App_Management_employee" does not exist