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來達到避免生成一個新的、單獨的表格
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章