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

What minimal files i need to use django ORM

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

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

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

user.save()

现在我不希望其中有不必要的文件和数据。但我不确定我需要哪些文件。我需要

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

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

我也需要创建一个应用吗

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

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

在应用程序目录中,您真正需要的是 __init__.py 文件、迁移目录和 models.py 文件

在 models.py 中,有 "from django.db import models",然后让您的模型继承自 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$#)(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" 应用中删除管理、视图和测试
  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,我可以摆脱那个导入语句和 BASE_DIR,带来我的 settings.py 行总数减少到 4 行(db 设置,root_url、installed_apps 和 secret_key)

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

对于 Django 1.9,我只需要你在 运行 django-admin startproject 之后得到的几个文件:settings.py 只有 3 个变量,和 manage.py。这两个,再加上 wsgi.py 中的一段代码,以及一些基本的目录结构元素,可以让您获得一个有效的独立 ORM 设置。真的,如果你不想做迁移,你可以去掉 manage.py.

方法如下,link 到 GitHub 自己玩。

项目结构:

├── data
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   └── models.py
├── main.py
├── manage.py
└── settings.py

data 目录和迁移目录包含空 __init__.py 文件。示例 models.py 文件内容如下:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField(max_length=255)

manage.py 文件是典型的 Django manage.py 文件。如果您从新的 django-admin startproject 命令复制它,请务必更改 os.environ.setdefault 中的设置参数:

#!/usr/bin/env python
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

settings.py 文件需要 3 个设置:DATABASES、INSTALLED_APPS 和 SECRET_KEY。对于不是 SQLite 的数据库,请参阅 Django 文档:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': 'sqlite.db',
    }
}

INSTALLED_APPS = (
    'data',
    )

SECRET_KEY = 'REPLACE_ME'

真正的诀窍在于 main.py,您可以在其中针对您的模型进行编码。显然,您必须使用 wsgi.py 中的一些代码才能使用这两行:

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

这是一个示例 main.py:

# Django specific settings
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")

### Have to do this for it to work in 1.9.x!
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
#############

# Your application specific imports
from data.models import *

#Add user
user = User(name="someone", email="someone@example.com")
user.save()

# Application logic
first_user = User.objects.all()[0]

print(first_user.name)
print(first_user.email)

This project along with this post 是我找到答案的有用起点,我的 Django 1.9 工作代码的拉取请求已合并,因此您现在可以从 masnun 的存储库中获取代码。如果您知道更好的方法,请提交拉取请求。