因为研究需要对已采集的医案进行结构化处理并进行校对,故开发此网站,下面简单记录思路和一些步骤,以免后期忘记。

1 需求分析设计

有三个表,在设计的word文档上。

2 构建Django项目

打开Pycharm,创建一个Django项目,如下图。
image.png

3 创建App

在项目下创建一个case_check的app,用命令创建。
首先进入项目目录并启动虚拟目录,如图所示。
image.png
然后,用下面命令创建app:
python manage.py startapp case_check
得到下图红色区域所示结构的app。
image.png

4 编写models

下面是原始医案的model

class OriginCase(models.Model):
    content = models.TextField(verbose_name="医案内容")
    prescription = models.CharField(max_length=255, verbose_name="处方(方剂名称)")
    herbs = models.TextField(verbose_name="处方对应的中药集合")
    syndrome = models.CharField(max_length=50, verbose_name="诊断的证型")
    symptoms = models.CharField(max_length=1024, verbose_name="症状集合")
    symptom_elements = models.CharField(max_length=1024, verbose_name="证素集合")
    source = models.CharField(max_length=100, verbose_name="来源于哪一本书或网站")
    doctor = models.CharField(max_length=100, verbose_name="开处方的医生名字")
    date = models.DateTimeField(auto_now_add=True, verbose_name="医案录入时间")
    check_flag = models.CharField(max_length=10, verbose_name="是否已经安排校对,也就是此医案是否已经进入到checcase表中")

5 数据迁移

5.1 创建迁移文件

完了之后,需要创建迁移文件(migration)。
在命令行执行命令(要注意:case_check是刚刚创建的app,需要把这个带上,不然会提示:No changes detected):

python manage.py makemigrations case_check

这时候报错:No installed app with label 'case_check'.
分析原因是app没有在settings.py文件中配置上去。
打开settings.py文件,在INSTALLED_APPS列表中加入刚刚创建的case_check这个app,如下图红色框中部分:
image.png
再次在命令行中执行python manage.py makemigrations case_check,如下提示表示迁移文件创建成功:

(venv4network) D:\mypython\TCMWeb>python manage.py makemigrations case_check
Migrations for 'case_check':
  case_check\migrations\0001_initial.py
    - Create model OriginCase

5.2 执行数据迁移

前面步骤中创建好数据迁移文件之后,开始执行数据迁移,数据迁移完成之后,就会在数据库中创建对应的表。
首先,需要在setting.py中配置数据库连接信息,默认情况下Django用的是SQLlite,本项目用的MySQL,所以需要重新配置。配置代码如下:

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }

    'default':
    {
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'tcm', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
        'PORT': 3306, # 端口
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '你的面目', # 数据库密码
    }
}

第二步,在配置好数据库之后,就开始执行迁移命令:python manage.py migrate
正常情况下显示如下:

(venv4network) D:\mypython\TCMWeb>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app1, auth, case_check, contenttypes, sessions
Running migrations:
  Applying case_check.0001_initial... OK

此时,打开MySQL数据库,能够看到已经创建了你的表,不过需要注意的是,为了防止整个项目中出现同名的model而导致数据库表相同的情况,在数据库表名前自动给加上了app的名字。
image.png

5.3 修改model后重新数据迁移

在测试时,发现OriginCase中添加了一个user外键,但生成的数据表中却还是没有这个字段。因为当前数据库内容为空,所以打算删除数据库表,重新再进行一边数据迁移。这时需要做一下三个方面的操作:
首先,删除数据库中的表。
第二,进入你当前app文件夹下面的migrations目录,删除除了__init__.py以外的所有文件,顺便把__pycache__目录也删了。
第三,进入数据表django_migrations中,找到你的app对应的记录,删除这些记录。(注意:一定要删除,不然你重新迁移后还是不会执行迁移,报如下的信息:

Running migrations:
  No migrations to apply.


上述操作完成后,在执行迁移文件生成命令和执行迁移的命令,就重新生成数据库表了。
重新生成迁移文件:

(venv4network) D:\mypython\TCMWeb>python manage.py makemigrations
Migrations for 'app1':
  app1\migrations\0001_initial.py
    - Create model TCM_Test
Migrations for 'case_check':
  case_check\migrations\0001_initial.py
    - Create model OriginCase
    - Create model CheckedCase

执行迁移:

(venv4network) D:\mypython\TCMWeb>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app1, auth, case_check, contenttypes, sessions
Running migrations:
  Applying app1.0001_initial... OK
  Applying case_check.0001_initial... OK

6 管理后台修改

6.1配置admin.py文件

Django管理后台很强大,只需要把Model做一些简单配置就拥有一个可以增、删、改的后台。
对App目录(case_check)下的admin.py文件进行编辑:

from django.contrib import admin
from .models import CheckedCase, OriginCase

# Register your models here.
@admin.register(OriginCase)
class OriginCaseAdmin(admin.ModelAdmin):
    list_display = ('content', 'prescription','herbs','syndrome','symptoms',
                    'symptom_elements','source','doctor','date','check_flag')
    fields = ('content', 'prescription','herbs','syndrome','symptoms',
                    'symptom_elements','source','doctor')

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        return super(OriginCaseAdmin, self).save_model(request, obj, form, change)

@admin.register(CheckedCase)
class CheckCaseAdmin(admin.ModelAdmin):
    list_display = ('content', 'prescription', 'herbs', 'syndrome', 'symptoms',
                    'symptom_elements', 'source', 'doctor', 'date_check', 'user', 'check_order')
    fields = ('content', 'prescription', 'herbs', 'syndrome', 'symptoms',
              'symptom_elements', 'source', 'doctor', 'user', 'check_order')

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        return super(OriginCaseAdmin, self).save_model(request, obj, form, change)

这样就可以进入后台对OriginCase进行增加、删除和修改,这个就基本上类似于一个简单的cms系统了。但是,目前还无法进入后台,因为没有账号,需要创建一个超级管理账号。

6.2 创建Django管理后台用户

在命令行执行命令python manage.py createsuperuser,按提示创建用户:

(venv4network) D:\mypython\TCMWeb>python manage.py createsuperuser
Username (leave blank to use 'administrator'): root_www
Email address:
Password:
Password (again):

用账号登录后,就可以看到后台页面了。
image.png
当然,这个样子还是比较丑陋,官方提供的admin后台就是这样,要美化得靠自己。

7 美化页面

为了走捷径,想找一个直接可以美化后台的插件,首先找到额是xadmin,但是这个插件已经很多年没有更新了,当前项目是建立在Django3.2上面,在网上查资料显示xadmin在Django3.x版本上报错较多,于是再找找其它的插件。
其中,这篇文章可以参考https://zhuanlan.zhihu.com/p/...
不过看到国内有一个django-antd-tyadmin好像也还可以,但还没有试过,等有时间了测试一下。

8 后台完善

8.1 用户登录后只能看到自己录入的信息

首先,创建一个普通用户,配置好权限,用此用户登录后台,录入一条医案信息。这时候加上原来超级用户录入的信息,后台就有两条信息了。
image.png
第二步,在admin.py中进行如下修改,重写get_queryset(self, request)方法,把queryset过滤加上去,只返回自己录入的医案:

class OriginCaseAdmin(admin.ModelAdmin):
    list_display = ('content', 'prescription','herbs','syndrome','symptoms',
                    'symptom_elements','source','doctor','date','user', 'check_flag')
    fields = ('content', 'prescription','herbs','syndrome','symptoms',
                    'symptom_elements','source','doctor')

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        return super(OriginCaseAdmin, self).save_model(request, obj, form, change)

    def get_queryset(self, request):
        qs = super(OriginCaseAdmin, self).get_queryset(request)
        return qs.filter(user = request.user)

image.png


1 声望0 粉丝