django踩坑记录(1)

前言

祝各位程序猿1024程序员节快乐
No +班,No bug,No 996.

Desc: 简单记录一下,使用Django开发的采坑记录,如果以后再遇到这种情况的时候,可以快速知道如何解决

0x01、设计表结构的几个重要点
  • 首先找出有哪些实体
  • 然后找出这些实体有哪些字段
  • 每个字段的类型、是否必填、长度是多少、是否存在默认值(有些字段是需要拿最小的单位去存储,避免从低精度转换到高精度的时候,出现丢失精度的情况)
实体1 <关系> 实体2

例如:在django开发在线教育网站里边,存在的实体如下:
课程 章节 视频 课程资源

实体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
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
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来达到避免生成一个新的、单独的表格

你可能感兴趣的:(python,Django)