【Django 天天生鲜项目01】框架、数据表设计、项目框架笔记

记录项目的框架、数据表设计、项目框架等通用内容

仅作为个人笔记!

目录

1.总体设计

1.1. 项目架构

1.2.数据表设计

1.3.模型类设计

2.项目框架搭建


 

1.总体设计

1.1. 项目架构

【Django 天天生鲜项目01】框架、数据表设计、项目框架笔记_第1张图片

1.2.数据表设计

数据表一定要充分考虑,设计好,不能中途改动,设计模型类的更改很麻烦

【Django 天天生鲜项目01】框架、数据表设计、项目框架笔记_第2张图片

  • 一个用户可以添加多个地址,一对多的关系,地址可以独立为一个地址表。
  • 一个商品可能有多个图片,需要商品图片表;
  • 类似的还有一个订单对应多个商品,需要创建订单商品表...
  • *表示根据需求决定是否需要该字段

 

 

1.3.模型类设计

模型类设计:模型类设计之前一定要分析设计好表,一旦开始就不要再改动了。

1)在自己的抽象模型类设计中,设计一个模型类的抽象基类BaseModel,记录创建时间、更新时间、删除标记 。每个类继承之。(在元类中说明是抽象模型类)

(2)在用户模块中,按数据库设计,先设计相应的模型类:

注:外键需要两个位置参数,一个是关联的模型(被关联的类)和 on_delete 选项。在Django2.0版本后, on_delete 选项为必填。

from django.db import models
from django.contrib.auth.models import AbstractUser  # 从auth用户验证模块中导入AbstractUser
from db.base_model import BaseModel
# Create your models here.


class User(AbstractUser, BaseModel):
    """用户模型类"""

    class Meta:
        db_table = 'df_user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name


class Address(BaseModel):
    """地址模型类"""
    user = models.ForeignKey('User', verbose_name='所属账户', on_delete=models.CASCADE,)
    receiver = models.CharField(max_length=20, verbose_name='收件人')
    addr = models.CharField(max_length=256, verbose_name='收件地址')
    zip_code = models.CharField(max_length=6, null=True, verbose_name='邮政编码')
    phone = models.CharField(max_length=11, verbose_name='联系电话')
    is_default = models.BooleanField(default=False, verbose_name='是否默认')

    class Meta:
        db_table = 'df_address'
        verbose_name = '地址'
        verbose_name_plural = verbose_name

(3)商品模块模型类

from django.db import models
from db.base_model import BaseModel
from tinymce.models import HTMLField  # 用富文本类型,需要配置app、默认配置和urls


# Create your models here.


class GoodsType(BaseModel):
    '''商品类型模型类'''
    name = models.CharField(max_length=20, verbose_name='种类名称')
    logo = models.CharField(max_length=20, verbose_name='标识')
    image = models.ImageField(upload_to='type', verbose_name='商品类型图片')

    class Meta:
        db_table = 'df_goods_type'
        verbose_name = '商品种类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class GoodsSKU(BaseModel):
    '''商品SKU模型类'''
    status_choices = (
        (0, '下线'),
        (1, '上线'),
    )
    type = models.ForeignKey('GoodsType', verbose_name='商品种类')
    goods = models.ForeignKey('Goods', verbose_name='商品SPU')
    name = models.CharField(max_length=20, verbose_name='商品名称')
    desc = models.CharField(max_length=256, verbose_name='商品简介')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
    unite = models.CharField(max_length=20, verbose_name='商品单位')
    image = models.ImageField(upload_to='goods', verbose_name='商品图片')
    stock = models.IntegerField(default=1, verbose_name='商品库存')
    sales = models.IntegerField(default=0, verbose_name='商品销量')
    status = models.SmallIntegerField(default=1, choices=status_choices, verbose_name='商品状态')

    # choices参数可以限定取值范围,这里限定为上面的元组

    class Meta:
        db_table = 'df_goods_sku'
        verbose_name = '商品'
        verbose_name_plural = verbose_name


class Goods(BaseModel):
    '''商品SPU模型类'''
    name = models.CharField(max_length=20, verbose_name='商品SPU名称')
    # 富文本类型:带有格式的文本(不是Django内置的)
    detail = HTMLField(blank=True, verbose_name='商品详情')

    class Meta:
        db_table = 'df_goods'
        verbose_name = '商品SPU'
        verbose_name_plural = verbose_name


class GoodsImage(BaseModel):
    '''商品图片模型类'''
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品')
    # 下面的upload_to='goods'只是随便写给django默认的文件处理系统用的,我们的项目不用这个上传行为
    image = models.ImageField(upload_to='goods', verbose_name='图片路径')

    class Meta:
        db_table = 'df_goods_image'
        verbose_name = '商品图片'
        verbose_name_plural = verbose_name


class IndexGoodsBanner(BaseModel):
    '''首页轮播商品展示模型类'''
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品')
    image = models.ImageField(upload_to='banner', verbose_name='图片')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_banner'
        verbose_name = '首页轮播商品'
        verbose_name_plural = verbose_name


class IndexTypeGoodsBanner(BaseModel):
    '''首页分类商品展示模型类'''
    DISPLAY_TYPE_CHOICES = (
        (0, "标题"),
        (1, "图片")
    )

    type = models.ForeignKey('GoodsType', verbose_name='商品类型')
    sku = models.ForeignKey('GoodsSKU', verbose_name='商品SKU')
    display_type = models.SmallIntegerField(default=1, choices=DISPLAY_TYPE_CHOICES, verbose_name='展示类型')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_type_goods'
        verbose_name = "主页分类展示商品"
        verbose_name_plural = verbose_name


class IndexPromotionBanner(BaseModel):
    '''首页促销活动模型类'''
    name = models.CharField(max_length=20, verbose_name='活动名称')
    url = models.URLField(verbose_name='活动链接')
    image = models.ImageField(upload_to='banner', verbose_name='活动图片')
    index = models.SmallIntegerField(default=0, verbose_name='展示顺序')

    class Meta:
        db_table = 'df_index_promotion'
        verbose_name = "主页促销活动"
        verbose_name_plural = verbose_name

(4)订单模块模型类

from django.db import models
from db.base_model import BaseModel
# Create your models here.


class OrderInfo(BaseModel):
    '''订单模型类'''
    PAY_METHOD_CHOICES = (
        (1, '货到付款'),
        (2, '微信支付'),
        (3, '支付宝'),
        (4, '银联支付')
    )

    ORDER_STATUS_CHOICES = (
        (1, '待支付'),
        (2, '待发货'),
        (3, '待收货'),
        (4, '待评价'),
        (5, '已完成')
    )

    order_id = models.CharField(max_length=128, primary_key=True, verbose_name='订单id')
    user = models.ForeignKey('user.User', verbose_name='用户')
    addr = models.ForeignKey('user.Address', verbose_name='地址')
    pay_method = models.SmallIntegerField(choices=PAY_METHOD_CHOICES, default=3, verbose_name='支付方式')
    total_count = models.IntegerField(default=1, verbose_name='商品数量')
    total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品总价')
    transit_price = models.DecimalField(max_digits=10, decimal_places=2,verbose_name='订单运费')
    order_status = models.SmallIntegerField(choices=ORDER_STATUS_CHOICES, default=1, verbose_name='订单状态')
    trade_no = models.CharField(max_length=128, verbose_name='支付编号')

    class Meta:
        db_table = 'df_order_info'
        verbose_name = '订单'
        verbose_name_plural = verbose_name


class OrderGoods(BaseModel):
    '''订单商品模型类'''
    order = models.ForeignKey('OrderInfo', verbose_name='订单')
    sku = models.ForeignKey('goods.GoodsSKU', verbose_name='商品SKU')
    count = models.IntegerField(default=1, verbose_name='商品数目')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='商品价格')
    comment = models.CharField(max_length=256, verbose_name='评论')

    class Meta:
        db_table = 'df_order_goods'
        verbose_name = '订单商品'
        verbose_name_plural = verbose_name

 

 

2.项目框架搭建

 

(1)创建虚拟环境,安装需要的包。

先安装一些基本的包如下:

Django==2.2
django-redis-sessions==0.5.6
django-tinymce==2.6.0
mysqlclient==1.4.6
pytz==2019.3
redis==3.0.1
redis-py-cluster==2.0.0
sqlparse==0.3.1

 

(2)创建Django项目

  • 创建Django项目,每个模块使用一个应用来实现,依次创建应用:python manage.py startapp 应用名
  • 由于应用较多,在项目中创建一个名为 appspython package ,将应用都放到这目录里面;
  • 在setting.py中注册应用:注意格式 'apps.应用名' ;(下面有更好的办法)
  • 配置urls,配置项目urls时同样注意:path('', include('apps.应用名.urls')),  

上面两步中,路径还需要指明apps较为麻烦,可以在setting.py中把 apps 加入到搜索路径中,上面两步就不用特意添加apps目录了

import sys

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # 这句本来就有,BASE_DIR 是项目的路径

sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))  # 在第0个位置加上apps目录

 

  • 配置静态文件目录

创建templates目录,setting.py中配置:

TEMPLATES = [
    {
        'BACKEND': ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]
  • 配置数据库:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '你的DB',
        'USER': 'root',
        'PASSWORD': '你的密码',
        'HOST': '你的地址',
        'PORT': '3306',
    }
}
  • 本地化:
LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai'
  • 静态文件配置

创建static目录,配置:

# 设置访问静态文件对应的url地址
STATIC_URL = '/static/'

# 设置静态文件存放的物理目录
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
  • 每个应用的urls.py

在每个应用的urls.py中,写上app_name = '应用名',项目urls中不用再写上 namespace

from django.urls import path, include, re_path
from 你的应用 import views

app_name = '应用名'
urlpatterns = [
     ...
]

 

(3)模型类设计

新建一个名为 db 的 python package,按照前面模型类的设计

 

  • 在自己的抽象模型类设计中,设计一个模型类的抽象基类BaseModel,记录创建时间、更新时间、删除标记 。每个类继承之。(在元类中说明是抽象模型类)。在db目录中,新建一个 base_model.py
from django.db import models


class BaseModel(models.Model):
    """模型抽象基类"""
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')  # verbose_name用于在admin中显示
    update_time = models.DateTimeField(auto_now=True, verbose_name='新年时间')
    is_delete = models.BooleanField(default=False, verbose_name='删除标记')

    class Meta:
        # 说明是一个抽象模型类
        abstract = True

 

  • 将各个设计好的模型类编写到对应的models.py中

将各个设计好的模型类编写到对应的models.py中;

注意注意

(1)用户模块中,由于使用了Django内置的认证系统,在进行迁移之前,一定要在 setting.py 配置文件中加一个配置项,指定认证系统使用的模型类是谁,替换默认的认证模型类

# 指定django认证系统使用的模型类
# AUTH_USER_MODEL = '应用名.类名'

AUTH_USER_MODEL = 'user.User'

(2)在mysql中创建表 dailyfresh ,并编辑配置文件,配置数据库远程连接,参考:数据库配置远程连接。

然后执行迁移:

python manage.py makemigrations
python manage.py migrate
 

查看数据库,生成以下表:

mysql> show tables;
+--------------------------+
| Tables_in_dailyfresh     |
+--------------------------+
| auth_group               |
| auth_group_permissions   |
| auth_permission          |
| df_address               |
| df_goods                 |
| df_goods_image           |
| df_goods_sku             |
| df_goods_type            |
| df_index_banner          |
| df_index_promotion       |
| df_index_type_goods      |
| df_order_goods           |
| df_order_info            |
| df_user                  |
| df_user_groups           |
| df_user_user_permissions |
| django_admin_log         |
| django_content_type      |
| django_migrations        |
| django_session           |
+--------------------------+

项目大致框架搭建完毕。

 

01 框架、数据表设计、项目框架笔记

02 注册、登录、用户中心 (itsdangerous模块加密、celery异步、 Django 的验证系统、redis作为缓存等)

03 FastDFS文件存储-首页-详情页-列表页

04 搜索(搜索引擎、分词包的使用)、购物车

05 订单(Mysql事务、并发处理、支付宝支付、评论)

06 项目部署(uwsgi服务器、Nginx服务器)

-----end-----

你可能感兴趣的:(Django实战)