一个在IT行业摸爬打滚的程序猿

0%

django踩坑记录(1)

前言

祝各位程序猿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踩坑记录系列