Django连接 mssql

 1. 基础

1.1 创建项目和应用

        首先,在命令行中创建项目shop,然后再进入项目,再创建应用sell

python manage.py startproject shop
cd myproject
python manage.py startapp sell
python manage.py startapp article

1.2 目录介绍 

        这里记一下django目录中各个py文件的作用

8490c4285a8f41d493ba3edcf6e9fc11.png

project: 

  • settings.py:是整个项目的配置文件,项目的所有配置都在这里进行(声明可用的APP、django依赖的中间件、模板信息、数据库信息、密码验证、语言、时区……)
  • urls.py:Django的路由分发器,所有的请求都会由此进行匹配,进而分发到每个视图中去。
  • wsgi :使用其他服务器的启动文件。

APP:

  • __init__ .py:APP的初始化文件。
  • admin.py:后台管理模型文件。
  • apps.py:django自动生成的APP配置信息,在settings中声明APP应用需要用到。
  • models.py:模型文件,所有APP模型在这里创建。
  • tests.py:测试文件,所有APP测试在这里创建。
  • views :视图函数文件,所有的APP视图函数在这里创建。
  • **urls.py **:APP的路由分发器。一个请求过来,先由shop文件下的urls.py分发请求到每个APP,再由APP下的urls.py分发到对应的视图函数。其实就是一个中间路由分发器,这样设计规避了不同APP试图函数命名冲突的问题。

1.3 设置setting

        首先,在shop/setting.py中在INSTALLED_APPS中添加新建的应用

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'sell.apps.SellConfig',
    'article.apps.ArticleConfig',
]

        然后,在shop/setting.py中修改数据库的配置,这里使用微软的SQL Server。首先 在命令行中安装mssql-django

pip install mssql-django -i https://pypi.tuna.tsinghua.edu.cn/simple
# setting.py
DATABASES = {
    'default': {
        'ENGINE': 'mssql',
        'NAME': 'xxx',
        'HOST':"127.0.0.1",
        'PORT':'1433',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'MARS_Connection': 'True',
            'trusted_connection': 'yes',
        }
    }
}

 1.4 运行

在项目shop下,命令行输入

python manage.py runserver

 56c116b9585d41479d853fdbd63649bc.png

 

2. 数据模型(models.py)

        使用Django编写一个数据库驱动的Web应用时,第一步就是定义模型(models),也就是数据库的结构设计和附加的其他元数据。Django支持ORM(对象关系映像),所以可以使用模型类来操作关系型数据库。

2.1 在应用中添加数据模型

        在这里通过继承models.Models的类来创建各个表,各种常见的语法如图。

tip:设置外键的时候,models.ForeignKey([被参考表名],on_delete=models.CASCADE,default=''),默认指向被参考表的主键,如果想要自定义,可以添加to_field=[被参考的列名]。

from django.db import models

# Create your models here.
class 店铺账号(models.Model):
    账号 = models.CharField(max_length=8, primary_key=True, unique=True)
    密码 = models.CharField(max_length=8)
    店铺名 = models.CharField(max_length=8,default='null')

class 员工信息(models.Model):
    店铺 = models.ForeignKey(店铺账号, on_delete=models.CASCADE, default='')
    账号 = models.CharField(max_length=8, primary_key=True)
    姓名 = models.CharField(max_length=5)
    性别 = models.CharField(max_length=2)
    职位 = models.CharField(max_length=5)
    薪资 = models.DecimalField(max_digits=7, decimal_places=2)
    入职日期 = models.DateTimeField()
    联系方式 = models.CharField(max_length=11,unique=True)

class 打卡(models.Model):
    店铺 = models.ForeignKey(店铺账号, on_delete=models.CASCADE, default='')
    打卡人 = models.ForeignKey(员工信息, on_delete=models.CASCADE)
    打卡时间 = models.DateTimeField()
    下班时间 = models.DateTimeField()


class 今日销售(models.Model):
    店铺 = models.ForeignKey(店铺账号, on_delete=models.CASCADE, default='')
    今日销售额 = models.DecimalField(max_digits=6, decimal_places=2, default=0)
    微信 = models.DecimalField(max_digits=6, decimal_places=2, default=0)
    支付宝 = models.DecimalField(max_digits=6, decimal_places=2, default=0)
    现金 = models.DecimalField(max_digits=6, decimal_places=2, default=0)

class 入库(models.Model):
    店铺 = models.ForeignKey(店铺账号, on_delete=models.CASCADE, default='')
    入库人 = models.ForeignKey(员工信息, on_delete=models.CASCADE)
    供货商名 = models.CharField(max_length=8)
    货物号 = models.CharField(max_length=8)
    货物名 = models.CharField(max_length=20)
    入库数量 = models.PositiveSmallIntegerField()
    入库日期 = models.DateTimeField()
    进价 = models.DecimalField(max_digits=6, decimal_places=2)

class 库存(models.Model):
    店铺 = models.ForeignKey(店铺账号, on_delete=models.CASCADE, default='')
    商品名 = models.CharField(max_length=20, unique=True)
    商品号 = models.CharField(max_length=8, primary_key=True)
    库存数量 = models.PositiveSmallIntegerField()
    定价 = models.DecimalField(max_digits=6, decimal_places=2)

class 会员(models.Model):
    会员号 = models.CharField(max_length=8, primary_key=True)
    性别 = models.CharField(max_length=2)
    姓氏 = models.CharField(max_length=5)
    累计消费 = models.DecimalField(max_digits=6, decimal_places=2)
    会员等级 = models.CharField(max_length=4)
    优惠券 = models.CharField(max_length=10)

class 消费(models.Model):
    店铺 = models.ForeignKey(店铺账号, on_delete=models.CASCADE, default='')
    会员号 = models.ForeignKey(会员, on_delete=models.CASCADE)
    商品 = models.CharField(max_length=20)
    商品号 = models.ForeignKey(库存, on_delete=models.CASCADE)
    商品数量 = models.PositiveSmallIntegerField()
    总金额 = models.DecimalField(max_digits=6, decimal_places=2)
    折扣 = models.CharField(max_length=4)
    实付金额 = models.DecimalField(max_digits=6, decimal_places=2)
    支付方式 = models.CharField(max_length=4)
    交易时间 = models.DateTimeField()

class 评价(models.Model):
    店铺 = models.ForeignKey(店铺账号,on_delete=models.CASCADE,default='')
    商品号 = models.ForeignKey(库存,on_delete=models.CASCADE)
    会员 = models.ForeignKey(会员,on_delete=models.CASCADE,default='')
    评价星级 = models.PositiveSmallIntegerField(default=5)
    评价内容 = models.TextField()
    评价时间 = models.DateTimeField()

2.2 执行数据库迁移

在命令行中,先创建迁移文件,再实现数据库迁移

python manage.py makemigrations
python manage.py migrate

        生成迁移文件运行结果会显示做出的改动有哪些,实现迁移后,就是许多OK(已经迁移好了,没图了)。

 

3. 管理后台

首先在命令行中创建管理员账号

python manage.py createsuperuser

然后,根据提示,输入账号、邮箱、密码 

运行项目,在打开http://127.0.0.1:8000/后加上admin,就进入了后台管理界面

7a310bff7b7f4d2cbe7c6284a1cad867.png

然后在应用sell的admin.py中配置,创建后台控制模型类

  • list_display:设置显示的字段
  • search_fields:设置搜索可以用的字段
  • list_filter:设置右侧可以只对这些列的内容进行过滤查询
from django.contrib import admin
from .models import 店铺账号,员工信息,今日销售,入库,库存,会员,消费,打卡,评价

# Register your models here.
class 店铺账号Admin(admin.ModelAdmin):          # 创建模型Admin的类,继承自admin.ModelAdmin
    list_display = ('账号', '密码', '店铺名')  # 设置显示的字段
    search_fields = ('账号', '店铺名')       # 设置搜索的字段
    list_filter = ('账号', '店铺名')         # 设置过滤查询的字段,可以通过账号、店铺名来过滤查询

admin.site.register(店铺账号, 店铺账号Admin)  # 注册模型和模型Admin


class 员工信息Admin(admin.ModelAdmin):
    list_display = ('账号', '姓名', '性别', '职位', '薪资', '入职日期', '联系方式')
    search_fields = ('账号', '姓名')
    list_filter = ('账号', '性别', '职位')

admin.site.register(员工信息, 员工信息Admin)

class 打卡Admin(admin.ModelAdmin):
    list_display = ('店铺','打卡人','打卡时间','下班时间')
    search_fields = ('店铺','打卡人')
    list_filter = ('店铺',)
admin.site.register(打卡, 打卡Admin)

class 今日销售Admin(admin.ModelAdmin):
    list_display = ('店铺','微信','支付宝','现金','今日销售额')
    search_fields = ('店铺',)
    list_filter = ('店铺',)
admin.site.register(今日销售,今日销售Admin)

class 入库Admin(admin.ModelAdmin):
    list_display = ('店铺','入库人','供货商名','货物号','货物名','入库数量','入库日期','进价')
    search_field = ('店铺','供货商号','货物名',)
    list_filter = ('店铺','入库人','入库日期')
admin.site.register(入库,入库Admin)

class 库存Admin(admin.ModelAdmin):
    list_display = ('店铺','商品名','商品号','库存数量','定价')
    search_field = ('店铺','商品号','商品名')
    list_filter = ('店铺',)
admin.site.register(库存,库存Admin)

class 会员Admin(admin.ModelAdmin):
    list_display = ('会员号','性别','姓氏','累计消费','会员等级','优惠券')
    serch_field = ('会员号','姓氏')
    list_filter = ('性别','姓氏','会员等级')
admin.site.register(会员,会员Admin)

class 消费Admin(admin.ModelAdmin):
    list_display = ('店铺','会员号','商品','商品号','商品数量','总金额','折扣','实付金额','支付方式','交易时间')
    search_field = ('店铺','会员号','商品号')
    list_filter = ('店铺','交易时间','支付方式')
admin.site.register(消费,消费Admin)

class 评价Admin(admin.ModelAdmin):
    list_display = ('店铺','商品号','会员','评价星级','评价内容','评价时间')
    search_field = ('店铺','会员号')
    list_filter = ('店铺','评价时间')
admin.site.register(评价,评价Admin)

 d64c76d3205848c3ace0e829bc0e62bd.png

4. 路由

        URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都会发送到指定的URL地址中,然后服务器会将响应返回给浏览器。路由(URL)就是用来处理URL和函数之间关系的调度器。

        在Django框架中,路由(也被称为URL配置)是用来将用户的HTTP请求映射到特定的视图函数或者类的。当用户在浏览器中输入一个URL并发送请求时,Django会根据定义的路由规则,找到与这个URL匹配的视图函数或者类,然后执行这个视图函数或者类的代码。

         这个视图函数或者类的代码通常会包含对数据库的操作,例如查询数据、插入数据、更新数据或者删除数据。这些操作的结果通常会被用来创建HTTP响应,这个响应会被发送回用户的浏览器。  所以,把路由看作是用户的HTTP请求和视图函数或者类之间的桥梁。

        Django的路由流程如下:

  1.  查找全局urlpatterns变量,即shop/urls.py文件中定义的urlpatterns变量。
  2. 按照先后顺序,对URL注意匹配urlpatterns列表中的每个元素。
  3. 找到第一个 匹配时停止查找,根据匹配结果执行对应的处理函数。
  4. 如果没有找到匹配或出现异常,Django进行错误处理。

4.1 Django支持的路由形式

        Django支持的路由形式有3种。

        (1)精确字符串格式,即一个精确URL匹配一个操作函数。这是最简单的形式,适合对静态URL的响应。URL字符串可以不以“/”开头,但要以“/”结尾,例如:

path('admin/',admin.site.urls),
path('article/',views.article_list),

        (2)路径转换器格式。在匹配URL同时,通过URL进行参数获取和传递。语法格式如下:

<类型:变量名>,sell/<int:year>

格式转换类型:

  1. str:匹配除分隔符(/)外的非空字符,默认类型<year>等价于<str:year>
  2. int:匹配0和正整数
  3. slug:匹配字母、数字、横杠、下划线组成的字符串,str的子集
  4. path:匹配任何非空字符串,包括路径分隔符,是全集 

例如:

path('article/',views.article_list),
path('article/<int:year>/',views.year_archive),
path('article/<int:year>/<int:month>/',views.month_archive),
path('article/<int:year>/<int:month>/<slug:slug>/',views.article_detail)

        比方说,在http://127.0.0.1:8000/的后面加上article/1/2/demo,就会将参数传给views.py中的article_detail函数。

        接下来,在shop/urls.py文件中建立路由:

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/',admin.site.urls),
    path('articles/', views.article_list),
    path('articles/<int:year>/', views.article_year),
    path('articles/<int:year>/<int:month>/', views.article_month),
    path('articles/<int:year>/<int:month>/<int:day>/', views.article_day),
    path('articles/<int:year>/<int:month>/<int:day>/<slug:slug>/', views.article_detail),
]

        建好后,要在shop下自定义一个urls导入的views .py文件:

from django.http import HttpResponse

def article_list(request):
    return HttpResponse('文章列表')

def article_year(request,year):
    return HttpResponse('文章列表'+str(year))

def article_month(request,year,month):
    return HttpResponse('文章列表'+str(year)+'年'+str(month)+'月')

def article_day(request,year,month,day):
    return HttpResponse('文章列表'+str(year)+'年'+str(month)+'月'+str(day)+'日')

def article_detail(request,year,month,day,pk):
    return HttpResponse('文章列表'+str(year)+'年'+str(month)+'月'+str(day)+'日'+str(pk))

4.2 使用include包含路由

        在开发的过程中,如果把许多路由都放在shop/urls.py文件的urlpatterns变量中,代码会非常凌乱。此时可以将前缀内容相同的路由设置为一组,然后用include()函数包含分组的变量。

        修改shop/urls.py:

from django.contrib import admin
from django.urls import path
from django.urls import include

from .import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/',include('article.urls')),
]

        上面的代码使用include()函数引入了article.urls模块,所以需要在article目录下新建一个urls.py文件:

from django.urls import path
from . import views

urlpatterns = [
    path('articles/', views.article_list),
    path('articles/<int:year>/', views.article_year),
    path('articles/<int:year>/<int:month>/', views.article_month),
    path('articles/<int:year>/<int:month>/<int:day>/', views.article_day),
    path('articles/<int:year>/<int:month>/<int:day>/<slug:slug>/', views.article_detail),
]

        以及对应的views.py:

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse

def article_list(request):
    return HttpResponse('文章列表')

def article_year(request,year):
    return HttpResponse('文章列表'+str(year))

def article_month(request,year,month):
    return HttpResponse('文章列表'+str(year)+'年'+str(month)+'月')

def article_day(request,year,month,day):
    return HttpResponse('文章列表'+str(year)+'年'+str(month)+'月'+str(day)+'日')

def article_detail(request,year,month,day,pk):
    return HttpResponse('文章列表'+str(year)+'年'+str(month)+'月'+str(day)+'日'+str(pk))

        此时,可以删掉shop\views.py中的相应内容了 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值