Dajngo開發常見問題彙總 -- Model設計篇

  1. verbose_name 可以作爲第一個參數傳入,使書寫更加工整和有序;
name = models.CharField('類別名',default="", max_length=30,help_text="類別名")
  1. 請儘量爲每個model和field設置 verbose_name,也儘量爲每個model實現__str__方法,便於項目的文檔化管理;
class Meta:
    verbose_name = '商品輪播'
    verbose_name_plural = verbose_name

def __str__(self):
    return self.goods.name
  1. null=True, blank=True 一般同時出現,前者表示數據庫字段可以爲null,後者表示form中required = False,即可以爲空白;
birthday = models.DateField("出生年月",null=True, blank=True)
  1. 使用unique參數添加‘唯一約束’;
order_sn = models.CharField("訂單編號",max_length=30, null=True, blank=True, unique=True)

class Meta:
    verbose_name = '用戶收藏'
    verbose_name_plural = verbose_name
    unique_together = ("user", "goods")
  1. 外鍵需要設置 on_delete=models.CASCADE,表示級聯刪除(默認);
category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name="商品類目")
  1. 利用類似 get_user_model 的方法來實現Model之間的解耦;
# get_user_model方法會去setting中找AUTH_USER_MODEL
from django.contrib.auth import get_user_model
User = get_user_model()
  1. related_name 可以爲外鍵反向查詢的manager命名;
goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name="商品", related_name="images")
  1. 無論USE_TZ is False/True,請儘量使用django.utils.timezone.now(),當然更好的方法是使用 auto_now/auto_now_add = True;
add_time = models.DateTimeField(default=timezone.now, verbose_name="添加時間")
  1. 請將MySQL的數據庫存儲引擎設置爲INNODB;
"OPTIONS":{"init_command":"SET default_storage_engine=INNODB;"

PS:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章