feng0945 发表于 2023-6-8 17:03

DJnaog项目报错求大佬帮忙解决一下。

django4.2.1项目前后端分离的时候在写数据库迁移以后写一个视图就报错。 Conflicting 'menu' models in application 'user': <class 'user.models.Menu'> and <class 'api_file.apps.user.models.Menu'>. 检查了很多地方就是没有发现错误,请大佬们帮忙看下。
一下是主要代码:
views.py

from rest_framework.serializers import ModelSerializer
from api_file.apps.user import models
from rest_framework.viewsets import ModelViewSet


class ModelSerializer(ModelSerializer):
    class Meta:
      model = models.UserInfo
      fields = '__all__'


class user(ModelViewSet):
    queryset = models.UserInfo.all()
    serializer_class = ModelSerializer


models.py

from django.db import models
from api_file.apps.user.basemodel import BaseModel


class Menu(BaseModel):
    title = models.CharField(verbose_name='菜单名称', max_length=32)

    class Meta:
      app_label = 'user'

    def __str__(self):
      return self.title


class Permission(BaseModel):
    title = models.CharField(verbose_name='标题', max_length=32)
    url = models.CharField(verbose_name='含正则的URL', max_length=128)
    name = models.CharField(verbose_name='URL别名', max_length=32, unique=True)
    menu = models.ForeignKey(verbose_name='所属菜单', to='Menu', null=True, blank=True,
                           help_text='null表示不是菜单;非null表示是二级菜单', on_delete=models.CASCADE)
    pid = models.ForeignKey(verbose_name='关联的权限', to='Permission', null=True, blank=True, related_name='children',
                            help_text='对于非菜单权限需要选择一个可以成为菜单的权限,用户做默认展开和选中菜单。',
                            on_delete=models.CASCADE)

    def __str__(self):
      return self.title


class Role(BaseModel):
    title = models.CharField(verbose_name='角色名称', max_length=32)
    permissions = models.ManyToManyField(verbose_name='拥有的所有权限', to='Permission', blank=True)

    def __str__(self):
      return self.title


class UserInfo(models.Model):
    name = models.CharField(verbose_name='用户名', max_length=32, unique=True)
    password = models.CharField(verbose_name='密码', max_length=64)
    email = models.CharField(verbose_name='邮箱', max_length=32, unique=True)
    phone = models.CharField(max_length=11, blank=False, unique=True)
    icon = models.ImageField(upload_to='icon', default='icon/default.png')
    roles = models.ManyToManyField(verbose_name='拥有的所有角色', to='Role', blank=True)

    def __str__(self):
      return self.name

    def get_all_permissions(self):
      """
      获取用户拥有的所有权限
      """
      permissions = set()
      for role in self.roles.all():
            permissions |= set(role.permissions.all())
      return permissions

    def get_menu_permissions(self):
      """
      获取用户拥有的菜单权限
      """
      menu_permissions = set()
      for permission in self.get_all_permissions():
            if permission.menu:
                menu_permissions.add(permission.menu)
                menu_permissions |= set(permission.menu.permission_set.all())
      return menu_permissions

    def get_menu_permission_urls(self):
      """
      获取用户拥有的菜单权限的URL
      """
      urls = set()
      for permission in self.get_all_permissions():
            if permission.menu:
                urls.add(permission.url)
                urls |= set(permission.menu.permission_set.values_list('url', flat=True))
      return urls


settings

# -*- coding: utf-8 -*-
# @Time    : 2023-6-8 0008 14:28
from pathlib import Path
import os
import sys

BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, BASE_DIR)
sys.path.insert(1, os.path.join(BASE_DIR, 'apps'))

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-24(&)#p*5gas=*ovcn-zzi!pz=wwx!u%qq(9#k-jh7(h4i)dc$'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'user',
    'menu',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'api_file.urls'

TEMPLATES = [
    {
      'BACKEND': 'django.template.backends.django.DjangoTemplates',
      'DIRS':
      ,
      'APP_DIRS': True,
      'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
      },
    },
]

WSGI_APPLICATION = 'api_file.wsgi.application'

# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases

DATABASES = {
    'default': {
      'ENGINE': 'django.db.backends.mysql',
      'NAME': 'file_api',
      'USER': 'file',
      'PASSWORD': '',
    }
}
import pymysql

pymysql.install_as_MySQLdb()

# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
      'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
      'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
      'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
      'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/shanghai'

USE_I18N = True

USE_TZ = False

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/

STATIC_URL = 'static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'


以上是代码,我把整个工程也打包上传网盘:链接:https://pan.baidu.com/s/1jPiOWFdQsb-PE89_WRPBEw?pwd=60bg
提取码:60bg
--来自百度网盘超级会员V7的分享

kk159 发表于 2023-6-8 17:35

原生user的问题应该

loveucrazy 发表于 2023-6-8 21:10

应该是你的 user.models.py 的Menu 和 menu 这个app冲突了

feng0945 发表于 2023-6-9 09:08

loveucrazy 发表于 2023-6-8 21:10
应该是你的 user.models.py 的Menu 和 menu 这个app冲突了

我修改了Menu的还是一样的报错。 Conflicting 'menutitle' models in application 'user': <class 'user.models.MenuTitle'> and <class 'api_file.apps.user.models.MenuTitle'>.

feng0945 发表于 2023-6-9 09:09

kk159 发表于 2023-6-8 17:35
原生user的问题应该

我之前也是继承了原生的user也是报错,所以就没有用原生的模型,自己写的RBAC模型

kk159 发表于 2023-6-9 13:01

AUTH_USER_MODEL 这个改改试试

一闪一闪233 发表于 2023-6-10 03:48

from rest_framework.serializers import ModelSerializer
from user import models   # 从'user'导入模型,而不是'api_file.apps.user'
from rest_framework.viewsets import ModelViewSet


class ModelSerializer(ModelSerializer):
    class Meta:
      model = models.UserInfo
      fields = '__all__'


class user(ModelViewSet):
    queryset = models.UserInfo.all()
    serializer_class = ModelSerializer

feng0945 发表于 2023-6-12 09:52

一闪一闪233 发表于 2023-6-10 03:48
from rest_framework.serializers import ModelSerializer
from user import mo ...

谢谢!大佬的确是你说的这个问题,我检查了一下因为在settings里面注册的apps这个环境变量。这里这样引用这样写引用就出现了循环引用的问题。

feng0945 发表于 2023-6-12 09:52

kk159 发表于 2023-6-9 13:01
AUTH_USER_MODEL 这个改改试试

我没有用django自己的表继承,不用设置这个。
页: [1]
查看完整版本: DJnaog项目报错求大佬帮忙解决一下。