Skip to main content
 首页 » 编程设计

python之使用 django ORM 我需要最少的文件

2025年05月04日15jirigala

我有 python 模块来做一些事情,我需要在数据库中保存一些项目。

目前我正在使用原始 sql 插入数据。但我想为此使用 django ORM。

我不需要任何 url、 View 等。我想要的只是我可以创建模型,然后应该能够像这样保存它

user.save()

现在我不想在那里有不必要的文件和数据。但我不确定我需要哪些文件。我需要吗

settings.py 
urls.py 
views.py 
app folder. 

是否可以只有 models.py,然后在设置中设置 DATABASE config。

我还需要创建一个应用吗

请您参考如下方法:

您需要 settings.py。您不需要 urls.py 或 views.py。您将需要一个应用程序文件夹,并将该应用程序置于 settings.py 中的 INSTALLED_APPS 下。虽然有一种手动发现应用程序的方法,但工作量可能比您希望的要多。

您还需要运行迁移,并在这样做时创建一个迁移目录和文件。

在 app 目录中,您真正需要的是 __init__.py 文件、migrations 目录和 models.py 文件

在 models.py 中,“从 django.db 导入模型”,然后让您的模型继承自 models.Model。

完成所有这些,您就得到了一个非常准系统的 Django 设置,可以使用您的模型与数据库进行交互

编辑

为了解决这个问题,我启动了一个新的 Django 1.9 项目并开始处理 settings.py 文件,直到我破坏了一些东西。这就是我的开头:

""" 
Django settings for Test project. 
 
Generated by 'django-admin startproject' using Django 1.9. 
 
For more information on this file, see 
https://docs.djangoproject.com/en/1.9/topics/settings/ 
 
For the full list of settings and their values, see 
https://docs.djangoproject.com/en/1.9/ref/settings/ 
""" 
 
import os 
 
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
 
 
# Quick-start development settings - unsuitable for production 
# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ 
 
# SECURITY WARNING: keep the secret key used in production secret! 
SECRET_KEY = 'yp0at6d_bpr5a^j$6$#)(17tj8m5-^$p773lc6*jy%la!wu5!i' 
 
# 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', 
    'modeltest', 
] 
 
MIDDLEWARE_CLASSES = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 
ROOT_URLCONF = 'Test.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 = 'Test.wsgi.application' 
 
 
# Database 
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases 
 
DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 
 
 
# Password validation 
# https://docs.djangoproject.com/en/1.9/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/1.9/topics/i18n/ 
 
LANGUAGE_CODE = 'en-us' 
 
TIME_ZONE = 'UTC' 
 
USE_I18N = True 
 
USE_L10N = True 
 
USE_TZ = True 
 
 
# Static files (CSS, JavaScript, Images) 
# https://docs.djangoproject.com/en/1.9/howto/static-files/ 
 
STATIC_URL = '/static/' 

我还制作了一个示例 github 存储库,因此您可以探索最小设置的样子。 https://github.com/RobertTownley/BarebonesDjango

我能够在不破坏数据库交互的情况下做的事情(只要我一次完成所有这些,并且在第一次运行迁移之前):

  1. 从我的“modeltest”应用程序中删除管理、 View 和测试
  2. 删除 wsgi.py(假设它永远不会投入生产,也永远不会用于实际运行网络服务器)
  3. 从字面上删除 urls.py 中的所有内容并将其保留为空白文件(不幸的是,settings.py 期望 ROOT_URLCONF 指向某些内容)
  4. 从 settings.py 中删除所有 MIDDLEWARE_CLASSES,以及 TEMPLATES、WSGI_APPLICATION、所有国际化功能、DEBUG、ALLOWED_HOSTS 和所有评论:)

所以在这个实验结束时,我可以使用如下所示的 settings.py 文件与我的准系统模型进行交互(包括添加新字段):

import os 
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
SECRET_KEY = 'v7j%&)-4$(p&tn1izbm0&#owgxu@w#%!*xn&f^^)+o98jxprbe' 
INSTALLED_APPS = ['modeltest'] 
ROOT_URLCONF = 'BarebonesTest.urls' 
DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
} 

如果我知道 sqlitedb 所需位置的确切文件路径,或者切换到 postgres/mysql,我可以摆脱那个 import 语句和 BASE_DIR,使我的 settings.py 行总数减少到 4 行(数据库设置、root_url、installed_apps 和 secret_key)

我很想被证明是错误的(学习很有趣),但我认为您无法使用比这更小的 settings.py 文件:)