单独使用django model模块

Django是啥?

先来看下官网的描述

Django makes it easier to build better Web apps more quickly and with less code.

从上面可以看出,它是一个python web框架,它的宗旨是让开发者以最小的代码最简单的方式快速开发web应用

需求场景

django 是一个为web框架, 且它的ORM model模块很好用.因为项目需要,我需要在命令终端(terminal)直接操作该web服务器的数据库,又不想通过web请求来做这件事.
怎么办?可能你还是没听明白,直接上代码
目录结构

~/test/django/mysite1$ pwd
/home/itleaks/test/django/
├── db.sqlite3
├── __init__.py
├── __init__.pyc
├── manage.py
├── manage.pyc
├── mysite
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── settings.py
│   ├── settings.pyc
│   ├── urls.py
│   ├── urls.pyc
│   ├── wsgi.py
│   └── wsgi.pyc
└── sample
    ├── admin.py
    ├── admin.pyc
    ├── apps.py
    ├── apps.pyc
    ├── __init__.py
    ├── __init__.pyc
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── 0001_initial.pyc
    │   ├── __init__.py
    │   └── __init__.pyc
    ├── models.py
    ├── models.pyc
    ├── tests.py
    └── views.py

sample/models.py

from __future__ import unicode_literals

from django.db import models

# Create your models here.
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

sample/tests.py

from sample.models import Question
# Create your tests here.
if __name__ == "__main__":
    Question.objects.all()
    print 'ok'

上面的Question是一个model, 当该项目以网页运行时,在网页中输入http://127.0.0.1:8000/sample/test是能够正常运行的.但是当我希望在terminal直接执行python sample/tests.py时就会出错.为啥?其实这个问题就是一个运行时环境搭建问题

model运行时环境搭建

用过django的人都知道,当我们要启动它时,肯定都会先执行

python manage.py runserver

上面的manage.py就是用来准备django 框架的运行时环境的,所以我们要做的就是
做一个精简版的manage.py, 然后再执行我们的test.py.哪如何实现一个精简版本的manage.py里。我们先看错误.

No module named local_db.models

~/test/django$ python sample/tests.py 
Traceback (most recent call last):
  File "sample/tests.py", line 1, in <module>
    from sample.models import Question
ImportError: No module named sample.models

这个库找不到,其实正常来想,这个库确实应该找不到的, 因为sample目录是tests.py的父亲目录,不在它的搜索范围内, 自然找不到。但是我又要问了?为啥以web运行时就可以找到呢?这个就是manage.py的功能,它会把”/home/itleaks/test/django/”添加到模块搜索路径里,这样在web服务器启动test.py时自然能够找到sample.models模块.所以,解决这个问题很简单,在执行这个脚本前也添加这个路径。

export PYTHONPATH=/home/itleaks/test/django

然后再执行

python sample/tests.py 
Traceback (most recent call last):
  File "sample/tests.py", line 1, in <module>
    from sample.models import Question
  File "/home/itleaks/test/django/sample/models.py", line 3, in <module>
    from django.db import models
  File "/usr/local/lib/python2.7/dist-packages/django/db/__init__.py", line 14, in <module>
    if not settings.DATABASES:
  File "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", line 276, in __getattr__
    self._setup()
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 40, in _setup
    raise ImportError("Settings cannot be imported, because environment variable %s is undefined." % ENVIRONMENT_VARIABLE)
ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

看到没,第一个问题解决额,现在出现了另外一个问题DJANGO_SETTINGS_MODULE is undefined.

DJANGO_SETTINGS_MODULE is undefined

从这个提示看来,是没有配置setting.想来想去,init.py文件里面最适合添加配置了。由于我们需要访问到根目录下settings.py,因此只能在根目录下的init.py添加。这样同时必须将项目的父亲目录设置为模块路径
具体代码如下

export PYTHONPATH=/home/itleaks/test/django

修改init.py

import os
import sys

os.environ['DJANGO_SETTINGS_MODULE'] = 'django.mysite.settings'

sys.path.append(os.path.dirname(__file__))

修改tests.py

from django.sample.models import Question
# Create your tests here.
if __name__ == "__main__":
    Question.objects.all()
    print 'ok'

这样在一开始引用django.sample.models的时候,会加载init.py,自然将DJANGO_SETTINGS_MODULE赋值了
再执行

python local_db/tests.py 
ok

可见运行成功

模块路径优化

我们前面是通过export PYTHONPATH=/home/itleaks/test/django来将
我们的项目目录加入库搜索路径的,其实有一种更好的方法,就是在/usr/lib/python2.7/dist-packages/或者/usr/lib/python2.7/site-packages/下增加一个xxx.pth文件,里面的内容就是/home/itleaks/test/django,这样就自动加载了该路径

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值