Django的ORM使用记录


=Start=

缘由:

因为团队里现在都在用Django作为Web开发框架(Flask虽然简单、轻量,但并不适合团队协作开发),所以最近我的主要任务之一就是把之前用Flask写的Web应用往Django上迁移,虽然之前用过一段时间的Django,但并不熟悉,这次就想着在迁移的过程中记录一下大体过程,加深印象,也为方便以后参考。

正文:

0.使用MySQL数据库

先安装MySQLdb模块作为底层驱动(需要先安装MySQL的一些基础库);

(virtualenv) $ pip install MySQL-python

然后修改项目的settings.py配置数据库连接信息;

# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
# http://www.ziqiangxuetang.com/django/django-multi-database.html
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname1',
        'USER': 'your_db_user_name',
        'PASSWORD': 'yourpassword',
        "HOST": "localhost",
    },
    'db2': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname2',
        'USER': 'your_db_user_name',
        'PASSWORD': 'yourpassword',
        "HOST": "localhost",
    },
}

# use multi-database in django
DATABASE_ROUTERS = ['project_name.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
    #'app_name':'database_name',
    'app1': 'db1',
    'app2': 'db2',
}

验证数据库配置是否成功(没有报错则表示成功):

$ cd project_dir
$ python manage.py shell
>>> import MySQLdb
>>> from django.db import connection
>>> cursor = connection.cursor()
在Django中使用MySQL数据库
在Django中进行多数据库的设置
1.Django的ORM之Model
从头开始创建新表
使用已有的数据表

在基于Django的Web应用中可以直连MySQL进而操作MySQL数据库,比较灵活,但是也比较繁琐,需要注意防范SQL注入;

其次可以使用Django自身提供的ORM(比起SQLalchemy来说要简单一些),但需要编写models,对于已经存在的数据库表,可以通过inspectdb命令来自动生成models,比较方便『django create model from existing table』:

参考解答:

$ python manage.py inspectdb > django_app/models.py
$ python manage.py migrate
#可能会出现「A model can't have more than one AutoField.」的错误提示,所以需要编辑models.py,将 AutoField 那个字段设置成「primary_key=True」
$ vim django_app/models.py
$ python manage.py migrate

参考链接:

2.Django的ORM之QuerySet
  • filter()  #过滤(但不支持「不等于」,需要用到下面的exclude()或Q())
  • exclude()  #排除
  • Q()  #可用来做一些复杂的查询

==

3.Django的ORM如何实现「group by」
from django.db.models import Count
Members.objects.values('designation').annotate(dcount=Count('designation')).order_by('-dcount')

等价于:
SELECT designation, COUNT(designation) AS dcount FROM members GROUP BY designation ORDER BY dcount desc;
4.Django的ORM之数据表更改

我们设计数据库的时候,早期设计完后,后期会发现不完善,要对数据表进行更改,这时候就要了解一下「Django 数据表更改」的知识。

=END=

, ,

《“Django的ORM使用记录”》 有 1 条评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注