中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django框架自定義模型管理器與元選項用法分析

發布時間:2020-09-26 10:56:59 來源:腳本之家 閱讀:146 作者:笑-笑-生 欄目:開發技術

本文實例講述了Django框架自定義模型管理器與元選項用法。分享給大家供大家參考,具體如下:

自定義模型管理器

每個模型類默認都有一個 objects 類屬性,可以把它叫 模型管理器。它由django自動生成,類型為

django.db.models.manager.Manager

可以在模型類中自定義模型管理器,自定義后, Django將不再生成默認的 objects。(模型類可以自定義多個管理器)

例如:

class Department(models.Model):
  # 自定義模型管理器
  manager = models.Manager()

調用 Department.objects會拋出AttributeError異常,而 Department.manager.all()會返回一個包含所有Department對象的列表。

兩種情況需要自定義管理器

修改管理器返回的原始查詢集

需求: 調用 Department.manager.all()返回的是2009年之后成立的部門

管理器類中添加額外的方法,幫我們操作模型類對應的數據表

需求: 在管理器類中,定義一個創建部門的方法

一、自定義模型管理器

class DepartmentManager(Manager):
  # 修改管理器返回的原始查詢集
  def all(self):
    """重寫all方法:只返回2009年之后成立的部門"""
    return super().all().filter(create_date__gte=date(2009,1,1))
  # 在模型管理器中封裝增刪查的方法
  def create_dep(self, name, create_date):
    """新增一個部門"""
    dep = Department()
    dep.name = name
    dep.create_date = create_date
    dep.save()
    return dep # 返回新增后的員工對象

二、在模型類中使用自定義的模型管理器

class Department(models.Model):
  """部門類"""
  ...
  # 自定義模型管理器(默認的objects就不會再生成)
  objects = DepartmentManager()

三、在視圖函數中,使用自定義的模型管理器中的方法

def add_dep(request):
  """新增部門"""
  # d = Department()
  # d.name = '財務部'
  # d.create_date = date(2018, 1, 1)
  # d.save()
  # 調用自定義的模型管理器,新增一個部門
  Department.objects.create_dep('財務部', date(2018, 1, 1))
  # 返回的不再是所有的部門,而是2009年之后成立的部門
  # Department.objects.all()
  return redirect('/show_deps')

元選項(Meta)

一、修改表名:

Django默認生成的表名:

應用名小寫_模型類名小寫
可以通過在模型類中定義Meta類來修改表名:

class Department(models.Model):
  """部門類"""
  name = models.CharField(max_length=20)
  class Meta(object):
     """指定表名"""
     db_table = "department"

重新生成遷移文件,并遷移生成表,查看表名是否有修改

二、修改模型類在管理后臺的顯示名稱

Django框架自定義模型管理器與元選項用法分析

class Meta:
  # 定義表名
  db_table = 'department'
  # 定義在管理后臺顯示的名稱
  verbose_name = '部門'
  # 指定復數時的名稱(去除復數的s)
  verbose_name_plural = verbose_name

希望本文所述對大家基于Django框架的Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

溆浦县| 上杭县| 延安市| 吴江市| 怀远县| 西城区| 保山市| 龙口市| 深水埗区| 太白县| 泗阳县| 英超| 蒙阴县| 肃南| 丹巴县| 浦城县| 波密县| 山东| 岢岚县| 会同县| 株洲市| 尖扎县| 辽阳县| 苏尼特右旗| 勃利县| 资兴市| 安远县| 乐平市| 遵化市| 边坝县| 民权县| 牡丹江市| 土默特左旗| 林口县| 延庆县| 德江县| 南通市| 八宿县| 姜堰市| 从化市| 北川|