中有3个自定义模型时,Django makemigrations出错模型.py

2024-04-26 23:04:06 发布

您现在位置:Python中文网/ 问答频道 /正文

当我试图运行makemigrations时,出现了以下错误。在

ERRORS:
remoshin_manager_sys.RemoshinDoctor.groups: (fields.E304) Reverse accessor for 'RemoshinDoctor.groups' clashes with reverse accessor for 'RemoshinManager.groups'.
HINT: Add or change a related_name argument to the definition for 'RemoshinDoctor.groups' or 'RemoshinManager.groups'.

remoshin_manager_sys.RemoshinDoctor.groups: (fields.E304) Reverse accessor for 'RemoshinDoctor.groups' clashes with reverse accessor for 'RemoshinUser.groups'.
HINT: Add or change a related_name argument to the definition for 'RemoshinDoctor.groups' or 'RemoshinUser.groups'.

remoshin_manager_sys.RemoshinDoctor.user_permissions: (fields.E304) Reverse accessor for 'RemoshinDoctor.user_permissions' clashes with reverse accessor for 'RemoshinManager.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'RemoshinDoctor.user_permissions' or 'RemoshinManager.user_permissions'.

remoshin_manager_sys.RemoshinDoctor.user_permissions: (fields.E304) Reverse accessor for 'RemoshinDoctor.user_permissions' clashes with reverse accessor for 'RemoshinUser.user_permissions'.
HINT: Add or change a related_name argument to the definition for 'RemoshinDoctor.user_permissions' or 'RemoshinUser.user_permissions'.


remoshin_manager_sys.RemoshinManager.groups: (fields.E304) Reverse accessor for 'RemoshinManager.groups' clashes with reverse accessor for 'RemoshinDoctor.groups'.
HINT: Add or change a related_name argument to the definition for 'RemoshinManager.groups' or 'RemoshinDoctor.groups'.

remoshin_manager_sys.RemoshinManager.groups: (fields.E304) Reverse accessor for 'RemoshinManager.groups' clashes with reverse accessor for 'RemoshinUser.groups'.

HINT: Add or change a related_name argument to the definition for 'RemoshinManager.groups' or 'RemoshinUser.groups'.
remoshin_manager_sys.RemoshinManager.user_permissions: (fields.E304) Reverse accessor for 'RemoshinManager.user_permissions' clashes with reverse accessor for 'RemoshinDoctor.user_permissions'.

HINT: Add or change a related_name argument to the definition for 'RemoshinManager.user_permissions' or 'RemoshinDoctor.user_permissions'.   
remoshin_manager_sys.RemoshinManager.user_permissions: (fields.E304) Reverse accessor for 'RemoshinManager.user_permissions' clashes with reverse accessor for 'RemoshinUser.user_permissions'.




HINT: Add or change a related_name argument to the definition for 'RemoshinManager.user_permissions' or 'RemoshinUser.user_permissions'.
remoshin_manager_sys.RemoshinUser.groups: (fields.E304) Reverse accessor for 'RemoshinUser.groups' clashes with reverse accessor for 'RemoshinDoctor.groups'.

HINT: Add or change a related_name argument to the definition for 'RemoshinUser.groups' or 'RemoshinDoctor.groups'.
remoshin_manager_sys.RemoshinUser.groups: (fields.E304) Reverse accessor for 'RemoshinUser.groups' clashes with reverse accessor for 'RemoshinManager.groups'.

HINT: Add or change a related_name argument to the definition for 'RemoshinUser.groups' or 'RemoshinManager.groups'.
remoshin_manager_sys.RemoshinUser.user_permissions: (fields.E304) Reverse accessor for 'RemoshinUser.user_permissions' clashes with reverse accessor for 'RemoshinDoctor.user_permissions'.

HINT: Add or change a related_name argument to the definition for 'RemoshinUser.user_permissions' or 'RemoshinDoctor.user_permissions'.
remoshin_manager_sys.RemoshinUser.user_permissions: (fields.E304) Reverse accessor for 'RemoshinUser.user_permissions' clashes with reverse accessor for 'RemoshinManager.user_permissions'.

HINT: Add or change a related_name argument to the definition for 'RemoshinUser.user_permissions' or 'RemoshinManager.user_permissions'.

我可以得到很多关于这个错误的信息。但我的情况似乎没有。在

我有3个项目,每个项目都有不同的自定义用户模型。我使用了3个项目中的一个数据库,每个项目都有自己的自定义用户模型。在

remoshin_user_sys/RemoshinUser远程用户

Remshin_诊所系统/医生

remoshin_经理_sys/RemoshinManager

当我试图从remoshin_manager_sys运行makemigrations时发生了此错误。我不想将RemoshinDoctor和RemoshinUser设置为RemoshinManager的自定义用户模型。在

我的设置.py如下所示。在

^{pr2}$

如何避免这个错误?在

添加我的模型.py. 在

class RemoshinUserManager(BaseUserManager):
    def _create_user(self, email, password, is_staff, is_superuser, **extra_fields):
        now = timezone.now()

        if not email:
            raise ValueError('User must have a e-mail address.')

        email = self.normalize_email(email)

        user = self.model(email=email,
            is_staff=is_staff, is_active=True,
            is_superuser=is_superuser, last_login=now,
            date_joined=now, **extra_fields)

        user.set_password(password)

        user.save(using=self._db)

        return user

    def create_user(self, email, password, **extra_fields):
        return self.create_user(email, password, False, False, **extra_fields)

    def create_superuser(self, email, password):
        return self.create_user(user_email, password, True, True, **extra_fields)

    @receiver(post_save, sender=settings.AUTH_USER_MODEL)
    def create_auth_token(sender, instance=None, created=False, **kwargs):
        if created:
            Token.objects.create(user=instance)

class RemoshinUser(AbstractBaseUser, PermissionsMixin):
    email = models.CharField(max_length=128, primary_key=True)
    username = models.CharField(max_length=64)
    user_kana_name = models.CharField(max_length=32, blank=True)
    password = models.CharField(max_length=128)
    user_birthdate = models.DateField(null=True, blank=True)
    user_sex = models.SmallIntegerField(null=True)
    user_postno = models.CharField(max_length=7, blank=True)
    user_address1 = models.CharField(max_length=128)
    user_address2 = models.CharField(max_length=128, blank=True)
    user_telno = models.CharField(max_length=16, blank=True)
    user_photo = models.ImageField(blank=True)
    authentication_status = models.BooleanField(default=False)
    create_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['user_name', 'user_telno']

    objects = RemoshinUserManager()

    class Meta:
        verbose_name = _('user')
        verbose_name_plural = _('users')
        db_table = 'remosys_remoshin_user_tbl'

    def get_absolute_url(self):
        return "/users/%s" % urlquote(self.email)


    def email_user(self, subject, message, from_email=None):
        send_mail(subject, message, from_email, [self_email])








class RemoshinDoctorManager(BaseUserManager):
    def _create_user(self, email, password, is_staff, is_superuser, **extra_fields):
        now = timezone.now()

        if not email:
            raise ValueError('Doctor must have a e-mail address.')

        email = self.normalize_email(email)

        doctor = self.model(email=email,
            is_staff=is_staff, is_active=True,
            is_superuser=is_superuser, last_login=now,
            date_joined=now, **extra_fields)

        doctor.set_password(password)

        doctor.save(using=self._db)

        return doctor

    def create_user(self, email, password, **extra_fields):
        return self.create_user(email, password, False, False, **extra_fields)

    def create_superuser(self, email, password):
        return self.create_user(email, password, True, True, **extra_fields)

    @receiver(post_save, sender=settings.AUTH_USER_MODEL)
    def create_auth_token(sender, instance=None, created=False, **kwargs):
        if created:
            Token.objects.create(user=instance)


class RemoshinDoctor(AbstractBaseUser, PermissionsMixin):
    doctor_id = models.CharField(max_length=16, primary_key=True)
    clinic_id = models.ForeignKey(Clinic)
    email = models.CharField(max_length=128)
    password = models.CharField(max_length=128)
    username = username = models.CharField(max_length=64)
    doctor_photo = models.ImageField(blank=True, null=True)
    create_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'doctor_id'
    REQUIRED_FIELDS = ['clinic_id', 'email', 'password', 'username']

    objects = RemoshinDoctorManager()

    class Meta:
        verbose_name = _('doctor')
        verbose_name_plural = _('doctors')
        db_table = 'remosys_remoshin_doctor_tbl'

    def get_absolute_url(self):
        return "/doctors/%s" % urlquote(self.doctor_id)



class RemoshinManagerManager(BaseUserManager):
    def _create_user(self, username, email, password, is_staff, is_admin, **extra_fields):
        now = timezone.now()

        if not email:
            raise ValueError('Manager must have a e-mail address.')

        email = self.normalize_email(email)

        manager = self.model(username=username, email=email,
            is_active=True,
            is_superuser=is_admin,
            is_staff=is_staff,
            create_date=now,
            modify_date=now, **extra_fields)

        manager.set_password(password)

        manager.save(using=self._dåb)

        return manager

    def create_user(self, username, email, password, **extra_fields):
        return self._create_user(username, email, password, False, False, **extra_fields)

    def create_superuser(self, username, email, password, **extra_fields):
        return self._create_user(username, email, password, True, True, **extra_fields)


    @receiver(post_save, sender=settings.AUTH_USER_MODEL)
    def create_auth_token(sender, instance=None, created=False, **kwargs):
        if created:
            Token.objects.create(user=instance)



class RemoshinManager(AbstractBaseUser, PermissionsMixin):
    manager_id = models.CharField(max_length=16, primary_key=True)
    email = models.CharField(max_length=128)
    password = models.CharField(max_length=128)
    username = models.CharField(max_length=64)

    is_active   = models.BooleanField(default=True)
    is_admin    = models.BooleanField(default=False)
    is_staff    = models.BooleanField(default=False)

    create_date = models.DateTimeField(default=timezone.now)
    modify_date = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email']

    objects = RemoshinManagerManager()

    class Meta:
        verbose_name = _('manager')
        verbose_name_plural = _('managers')
        db_table = 'remosys_remoshin_manager_tbl'

    def get_absolute_url(self):
        return "/managers/%s" % urlquote(self.manager_id)

    def email_user(self, subject, message, from_email=None):
        send_mail(subject, message, from_email, [self.email])

    def user_has_perm(username, perm, obj):
        A backend can raise `PermissionDenied` to short-circuit permission checking.
        return _user_has_perm(username, perm, obj)

    def has_perm(self, perm, obj=None):
        return _user_has_perm(self, perm, obj=obj)

    def has_module_perms(self, app_label):
        return self.is_superuser

    def get_short_name(self):
        return self.first_name

    @property
    def is_superuser(self):
        return self.is_admin




class Consultation(models.Model):
    consultation_id = models.CharField(max_length=8, primary_key=True)
    user_email = models.ForeignKey(RemoshinUser)
    clinic_id = models.ForeignKey(Clinic)
    doctor_id = models.ForeignKey(RemoshinDoctor)
    consultation_datetime = models.DateTimeField(auto_now=True)
    consultation_status = models.BooleanField(default=False)
    prescription = models.TextField(blank=True)
    prescription_status = models.SmallIntegerField(default=0)
    payment_status = models.SmallIntegerField(default=0)
    create_date = models.DateTimeField(auto_now_add=True)
    modify_date = models.DateTimeField(auto_now=True)


    class Meta:
        db_table = 'remosys_consultation_tbl'
        # swappable = 'settings.AUTH_USER_MODEL'

Tags: orselftruepermissionsfieldsforismodels
1条回答
网友
1楼 · 发布于 2024-04-26 23:04:06

我用一个例子来解释这个错误:

你有这两种型号的吗。在

class Book(Models.model):
    title = models.CharField(maxlength = 100)

class Person(Models.model):
    name = models.CharField(max_length = 100)
    own_book = models.ForeignKey('Book')

简单的模型,但棘手的部分是,每当您定义外键时,Django都会构建反向引用:如果person是一个查询对象,那么对她拥有的书的标题的引用应该是:person.own_book.title。在

现在,如果你想知道拥有某本书的人的名字?Django构建反向关系,默认情况下使用模型名称。也就是说,“book”是一个queryset对象,您可以使用book.person.name找到拥有该书的人的姓名。很酷,对吧?它会查到你的外键。在

现在,向同一图书模型添加另一个外键:

^{pr2}$

你的前向关系仍然定义良好:person.wrote_book.title和{}。但是book.person.name该怎么办呢?查找拥有这本书的人的名字?写了这本书的人?还是两者都有?在那里,django只是抛出你的Reverse acessor error。在

如何修复?在名字中告诉你创建一个相关的模型:

class Person(Models.model):
    name = models.CharField(max_length = 100)
    wrote_book = models.ForeignKey('Book', related_name = 'wrote')
    own_book = models.ForeignKey('Book', related_name = 'own')

因此book.person.name不再存在(默认为覆盖),它被book.own.name和{}替换。在

所以我的猜测是:寻找在groupsuser_permissions模型中定义的外键,并在它们上添加相关的参数。在

相关问题 更多 >