祝各位程序猿1024程序员节快乐
No +班,No bug,No 996.
Desc: 简单记录一下,使用Django开发的采坑记录,如果以后再遇到这种情况的时候,可以快速知道如何解决
例如:在django开发在线教育网站里边,存在的实体如下:
课程 章节 视频 课程资源
实体1 <关系> 实体2
课程 章节 视频 课程资源
│ │ │ │
│ │ │ |
│ │ └──1 : N
│ └──1 : N
└── 1 : N
字段 | 详细描述 |
---|---|
位置 | apps.users.models.BaseModel(类) |
想要的功能描述 | django自带的auth_user表格的基本字段不能满足开发需要的时候,如何才能在基础的auth_user表格上面扩展增加字段呢 |
解决方法 | 在users.models里面增加一个类,这个类的的内容如下:这个类一定要继承from django.contrib.auth.models import AbstractUser ,即AbstractUser |
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
字段 | 详细描述 |
---|---|
位置 | apps.users.models.BaseModel(类) |
异常描述 | 后续添加的记录当中,所有的添加时间这个字段的时间都是一个时间,添加的时间都是项目启动的时候,编译的时间 |
解决方法 | 字段里面的datetime.now()改为datetime.now |
class BaseModel(models.Model):
"""这是公共的类"""
add_time = models.DateField(default=datetime.now, verbose_name="添加时间")
# 一定要注意这里填写的是datetime.now而不是datetime.now(),
# 如果是datetime.now()那么这个字段的时间就是编译时间,不是我们想要的添加时间
class Meta:
abstract = True # 添加这个是避免生成一个单独的表格
字段 | 详细描述 |
---|---|
位置 | apps.users.models.BaseModel(类) |
异常描述 | 编写的这个BaseModel类只是作为一个公共的类来继承、扩展的,与此同时,他自动生成了一个新的表格,但这不是我想要的 |
解决方法 | 在这个类的最后添加一个Meta,如: class Meta: abstract = True 来达到避免生成一个新的、单独的表格 |