You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django最佳实践:非应用专属模型及扩展User模型的存放方式

Django项目结构与User模型扩展的最佳实践

嘿,这两个问题其实是Django开发者刚接触项目架构时经常会纠结的点,我结合自己的实际项目经验和社区里的普遍做法来给你梳理下~

一、非应用专属模型要不要拆分到项目目录下?

Django的设计理念是**“应用优先”,也就是尽量把功能拆分成独立的应用,每个应用负责一块特定的业务,这样代码复用性和可维护性更高。但如果确实存在一些跨所有应用、属于项目全局层面**的模型(比如全局系统配置、通用的基础模型),把它们放在项目目录下是完全合理的,但这里有两个需要注意的点:

  • 如果你直接在项目根目录下新建models.py,记得要把你的项目包名(比如myproject)添加到INSTALLED_APPS里,不然Django无法识别这些模型,也没法生成迁移文件。
  • 更推荐的做法是在项目下新建一个专门的“核心应用”,比如叫core或common,把这些通用模型放到这个应用的models.py里。这样既符合Django的应用规范,又能把全局代码集中管理,后续扩展也更方便——比如你以后要加全局的工具函数、中间件,都可以放到这个core应用里。

二、扩展User模型:项目目录下建models.py是不是最佳实践?

关于扩展User模型,首先得明确Django推荐的几种扩展方式:AbstractUser(最常用,直接扩展原有字段)、AbstractBaseUser(完全自定义用户模型)、OneToOneField(和原有User模型关联,做扩展)。针对你的场景(添加邮箱确认功能),用AbstractUser是最省心的选择。

回到你的问题:

  • 如果只是临时的小项目,或者当前只需要扩展这一个模型,直接在项目目录下的models.py里定义扩展后的User模型是可以工作的,只要记得在settings.py里配置AUTH_USER_MODEL = 'myproject.MyUser'(替换成你的项目包名和模型名)。
  • 但从长期维护和扩展性来看,更推荐新建一个专门的应用,比如accounts或users,把扩展后的User模型、邮箱确认相关的模型(比如EmailVerification)都放到这个应用里。哪怕现在只有一个模型,这样的结构也更清晰——后续你要加用户资料、登录日志、权限相关的模型,都可以自然地放到这个应用里,不会让项目根目录的代码变得杂乱。

举个简单的例子,如果你用accounts app的话,结构大概是这样:

myproject/
├── myproject/
│   ├── settings.py
│   └── ...
├── accounts/
│   ├── models.py
│   ├── migrations/
│   └── ...
└── manage.py

然后在accounts/models.py里定义:

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

class User(AbstractUser):
    # 添加你的扩展字段,比如邮箱确认状态
    is_email_verified = models.BooleanField(default=False)

class EmailVerification(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    token = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

最后在settings.py里配置AUTH_USER_MODEL = 'accounts.User'就可以了。

这样的结构不仅符合Django的最佳实践,也让后续的功能扩展更顺畅,不会出现模型分散在各个地方的情况。

内容的提问来源于stack exchange,提问作者trouselife

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:49:44