0

我需要创建具有不同权限和层次结构的多种类型的用户。所有用户都是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
4

1 回答 1

0

我发现错误结果是因为我无意中删除了迁移初始化文件。但更正后,我收到一个新错误:

(myEnv) mohammed@Laptop:~/Projects/Transport_Project$ python3 manage.py migrate
Operations to perform:
  Apply all migrations: Drivers_App_Management, admin, auth, contenttypes, sessions
Running migrations:
  Applying Drivers_App_Management.0001_initial...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 227, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/migration.py", line 114, in apply
    operation.state_forwards(self.app_label, project_state)
  File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/operations/models.py", line 86, in state_forwards
    list(self.managers),
  File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/state.py", line 95, in add_model
    self.reload_model(app_label, model_name)
  File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/state.py", line 156, in reload_model
    self._reload(related_models)
  File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/state.py", line 189, in _reload
    self.apps.render_multiple(states_to_be_rendered)
  File "/home/mohammed/anaconda3/envs/myEnv/lib/python3.7/site-packages/django/db/migrations/state.py", line 314, in render_multiple
    "for more" % (new_unrendered_models, get_docs_version())
django.db.migrations.exceptions.InvalidBasesError: Cannot resolve bases for [<ModelState: 'Drivers_App_Management.Driver'>]
This can happen if you are inheriting models from an app with migrations (e.g. contrib.auth)
 in an app with no migrations; see https://docs.djangoproject.com/en/3.1/topics/migrations/#dependencies for more
于 2020-12-06T22:18:09.163 回答