前言
祝各位程序猿1024程序员节快乐
No +班,No bug,No 996.
Desc: 简单记录一下,使用Django开发的采坑记录,如果以后再遇到这种情况的时候,可以快速知道如何解决
0x01、设计表结构的几个重要点
- [x] 首先找出有哪些实体
- [x] 然后找出这些实体有哪些字段
- [x] 每个字段的类型、是否必填、长度是多少、是否存在默认值(有些字段是需要拿最小的单位去存储,避免从低精度转换到高精度的时候,出现丢失精度的情况)
实体1 <关系> 实体2
例如:在django开发在线教育网站里边,存在的实体如下:
课程 章节 视频 课程资源
1 2 3 4 5 6 7
| 实体1 <关系> 实体2 课程 章节 视频 课程资源 │ │ │ │ │ │ │ | │ │ └──1 : N │ └──1 : N └── 1 : N
|
0x02、自定义扩展django的用户表格auth_user表格,增加自定义字段
字段 |
详细描述 |
位置 |
apps.users.models.BaseModel(类) |
想要的功能描述 |
django自带的auth_user表格的基本字段不能满足开发需要的时候,如何才能在基础的auth_user表格上面扩展增加字段呢 |
解决方法 |
在users.models里面增加一个类,这个类的的内容如下:这个类一定要继承from django.contrib.auth.models import AbstractUser ,即==AbstractUser== |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| from datetime import datetime
from django.db import models from django.contrib.auth.models import AbstractUser # 自定义扩展的类,即增加多与原来的字段,一定要继承这个类
GENDER_CHOICES = ( ("male", "男"), ("female", "女") )
class UserProfile(AbstractUser): """用户表.2019-10-18重载django默认的auth_user,自定义扩展字段,一定要继承AbstractUser这个类""" nick_name = models.CharField(max_length=50, verbose_name="昵称", default="") birthday = models.DateField(verbose_name="出生日期", null=True, blank=True) gender = models.CharField(max_length=6, verbose_name="性别", choices=GENDER_CHOICES) address = models.CharField(max_length=100, verbose_name="地址", default="") mobile = models.CharField(max_length=11, verbose_name="手机号码", unique=True) # 注意手机号是唯一的 image = models.ImageField(upload_to="head_image/%Y/%m", default="default.jpg")
class Meta: verbose_name = "用户信息" verbose_name_plural = verbose_name # 这个为了避免前端展示的时候出现“课程信息s”这个字眼
def __str__(self): if self.nick_name: return self.nick_name else: return self.username
|
0x03、数据表字段“添加时间”一直出现异常
字段 |
详细描述 |
位置 |
apps.users.models.BaseModel(类) |
异常描述 |
后续添加的记录当中,所有的添加时间这个字段的时间都是一个时间,添加的时间都是项目启动的时候,编译的时间 |
解决方法 |
字段里面的==datetime.now()==改为==datetime.now== |
1 2 3 4 5 6 7 8
| class BaseModel(models.Model): """这是公共的类""" add_time = models.DateField(default=datetime.now, verbose_name="添加时间") # 一定要注意这里填写的是datetime.now而不是datetime.now(), # 如果是datetime.now()那么这个字段的时间就是编译时间,不是我们想要的添加时间
class Meta: abstract = True # 添加这个是避免生成一个单独的表格
|
0x04、如何避免添加一个基类,导致生成一个新的、单独的表格
字段 |
详细描述 |
位置 |
apps.users.models.BaseModel(类) |
异常描述 |
编写的这个BaseModel类只是作为一个公共的类来继承、扩展的,与此同时,他自动生成了一个新的表格,但这不是我想要的 |
解决方法 |
在这个类的最后添加一个Meta,如: class Meta: abstract = True 来达到避免生成一个新的、单独的表格 |
感谢认真读完这篇教程的您
先别走呗,这里有可能有你需要的系列文章:
Django踩坑记录系列;