前言
祝各位程序猿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 來達到避免生成一個新的、單獨的表格 |