Django电商平台
数据库设计
- 用户数据库模型设计
class UserProfile(AbstractUser):
# 继承Django原先的用户基类
'''
Username and password are required. Other fields are optional.
'''
gender_choice = [
('male', '男'),
('female', '女'),
]
username = models.CharField('用户名', max_length=30, unique=True)
mobile = models.CharField('电话', max_length=20, null=False, blank=False)
email = models.EmailField('邮箱', null=True, blank=True)
gender = models.CharField('性别', null=False, choices=gender_choice)
def __str__(self):
return self.username
class Meta:
db_table = 'user'
verbose_name = '用户信息'
verbose_name_plural = verbose_name
mobile = models.CharField('电话', max_length=20, null=False, blank=False)
1.null 是针对数据库而言的,False表示不能为空
2.blank 是针对表单而言,False 表示表单的该字段不能为空
gender = models.CharField('性别', null=False, choices=gender_choice)
如果提供了选择,则模型验证将强制执行这些选择,默认表单窗口小部件将是带有这些选择的选择框,而不是标准文本字段。
每个元组中的第一个元素是要在模型上设置的实际值,第二个元素是人类可读的名称。
- 安装第三方插件
# xadmin
$ pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2
# ckeditor
$ pip install django-ckeditor
-
将第三方插件要注册到应用中去
-
商品的数据库模型
class Category(models.Model):
# 类别的多种级别
types = [
(1, '一级类别'),
(2, '二级类别'),
(3, '三级列别')
]
# …………
category_type = models.IntegerField('类别级别', choices=types)
# 类别的多级分类
# 一级类别:二级类别 1:n
parent_category = models.ForeignKey('self', verbose_name='父级分类'
, related_name='sub_category', on_delete=models.CASCADE,null=True, blank=True)
# 是否添加导航
is_tab = models.BooleanField('是否导航', default=False)
add_time = models.DateTimeField('添加时间', default=datetime.now)
parent_category = models.ForeignKey('self', verbose_name='父级分类'
, related_name='sub_category', on_delete=models.CASCADE,null=True, blank=True)
# 父级分类和子分类 为 1:n关系
on_delete参数:
To create a recursive relationship – an object that has a many-to-one relationship with itself – use models.ForeignKey('self', on_delete=models.CASCADE).
级联删除。 Django会在DELETE CASCADE上模拟SQL约束的行为,并删除包含ForeignKey的对象。
- 后台站点显示
class GoodsAdmin(object):
# …………
# 在添加商品的时候可以添加商品图片
class GoodsImagesInline(object):
model = GoodsImage
# 不显示的字段名称
exclude = ["add_time"]
# 控制初始表单数量,默认为3
extra = 3
style = 'tab'
# 内部嵌套
inlines = [GoodsImagesInline]
- 进行数据填充
# 加载Django配置和Django APP的注册。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shopAPI.settings")
django.setup()
# 然后导入数据,引入之前定义的数据库模型,将数据进行填充
注意要在加载Django配置之后在导入数据库模型
- 配置多媒体文件存储路径
# settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
- 配置多媒体路由
# urls.py
urlpatterns = [
# …………
# 配置静态文件的路由
path('media/<path:path>', serve, {
'document_root': MEDIA_ROOT})
]
视图函数
-
视图函数的两种形式
-
FBV 视图函数接受request请求,函数体中直接是视图函数
-
CBV 该方法的视图继承了视图类views,然后类中可以定义各种http请求方式,
不同的请求方式可以对应不同的视图函数,即将对图函数和HTTP请求方式绑定,
编写路由的时候可以使用as_views()来使类生成视图函数
FBV适合小型项目,综合、大型项目可以使用CBV
-
-
Django API
- Django中可以通过原生的数据用json封装在返回response,但是图片、时间等字段不同正确转成json类型
- Django中提供的序列化类,可以实现弥补上述缺点,但是图片的存储为相对路径,不能将静态资源的绝对路径自动补全,例如MEDIA_ROOT、MEDIA_URL无法自动添加
- 使用DRF(Django Rest Framework)
-
什么是序列化?
序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程,例如json或者xml格式
-
序列化的作用
- 可以将查询集或者模型实例对象进行序列化为json或者xml格式,然后传输给用户
- 可以对post或者patch/put请求进行数据处理,并进行验证。
-
安装Django Rest Frameword的依赖包
$ pip install djangorestframework
# 自动生成API文档
$ pip install coreapi
# 文档的markdown展示
$ pip install markdown
# django-guardian是为Django提供额外的基于对象权限的身份验证后端
$ pip install django-guardian
# 过滤支持
$ pip install django-filter
# 最后在setting.py中添加第三方插件
- 视图函数的编写流程
1.编写序列化类,规定需要进行序列化传输的数据
2.编写视图类,其中使用序列化
3.配置路由
# app/goods/serializers.py
from rest_framework import serializers
# 编写序列化类,其中的字段需要和数据库模型中的字段名对应
class GoodsSerializers(serializers.Serializer):
name = serializers.CharField(required=True, max_length=20)
shop_price = serializers.FloatField(default=