輕量級辦公平台開發實錄(10):日程管理模型設計

1、創建日程管理APP

使用pycharm打開項目文件,創建app:

startapp dailyreport

將新建的app拖到apps目錄下,修改settings配置文件,將新建的app添加到INSTALLED_APPS

INSTALLED_APPS = [
django.contrib.admin,
django.contrib.auth,
django.contrib.contenttypes,
django.contrib.sessions,
django.contrib.messages,
django.contrib.staticfiles,
system,
dailyreport,

]

2、創建日程管理模型

打開sandboxOA/apps/dailyreport/models.py文件,寫入如下內容:

from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class DailyReport(models.Model):
cat_choices = ((0, 工作報告), (1, 項目記錄), (2, 日程安排))
category = models.CharField(max_length=20, choices=cat_choices, default=0)
content = models.TextField(verbose_name=工作日報)
user = models.ForeignKey(User, related_name=report_user, on_delete=models.DO_NOTHING, default=)
attention = models.ManyToManyField(User, related_name=attention, blank=True)
start_time = models.DateTimeField(default=, verbose_name=開始時間)
end_time = models.DateTimeField(default=, verbose_name=結束時間)
add_time = models.DateField(auto_now_add=True, verbose_name="添加時間")

def __str__(self):
return self.category

class Meta:
verbose_name = 工作日報
verbose_name_plural = verbose_name

創建資料庫文件:選擇Tools → Run manage.py Task..., 運行如下命令

makemigrations dailyreport
migrate

欄位選項說明:

  • related_name: 在django中可以給外鍵欄位設置related_name, 它的作用可以通過屬性值進行關係型數據的反向查詢,例如本次項目中我們想通過用戶張三 來查找他所有日程數據,查詢方法可以寫成:

from django.contrib.auth import get_user_model
User = get_user_model() # 使用自定義用戶認證模型

user = User.objects.get(name=張三)
report_all = user.dailyreport_set.all()

在本次項目DailyReport模型中,有兩個欄位是通過外鍵關聯到User的,如果使用上面的方法進行反向查詢,實際上是會報錯的,所以在實際項目中更多是使用related_name來進行反向查詢:

from django.contrib.auth import get_user_model
User = get_user_model()

user = User.objects.get(name=張三)
report_all = user.report_user.all()

同樣我們也可以查詢所有『張三』關注的日程:

from django.contrib.auth import get_user_model
User = get_user_model()

user = User.objects.get(name=張三)
report_all = user.attention.all()

  • on_delete :在django2.0版本以前,定關聯欄位時,on_delete選項並不是必須的,而在django2.0版本後,在定義關聯欄位時on_delete是必須要定義的,常用參數如下:

on_delete=models.CASCADE, # 刪除關聯數據,與之關聯也刪除
on_delete=models.DO_NOTHING, # 刪除關聯數據,什麼也不做
on_delete=models.PROTECT, # 刪除關聯數據,引發錯誤ProtectedError
on_delete=models.SET_NULL, # 刪除關聯數據,與之關聯的值設置為null
on_delete=models.SET_DEFAULT, # 刪除關聯數據,與之關聯的值設置為默認值

需要注意的是在使用SET_NULL的時候,該欄位在模型定義的時候需要設置可為空,例如:

user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)

同樣在使用SET_DEFAULT的時候,需要預先定義default:

user = models.ForeignKey(User, on_delete=models.SET_DEFAULT, default=默認值)


非常歡迎感興趣的朋友,到我的Github或知乎上做客,閑暇之餘給個贊或Star,贈人玫瑰手留余香^_^

知乎專欄SandBox:zhuanlan.zhihu.com/sand

輕量級辦公管理系統項目開源地址:github.com/RobbieHan/gi (乙方流程版)

輕量級辦公管理系統:github.com/RobbieHan/sa (定製版,本記錄同步項目)

QQ技術交流區:83792608

推薦閱讀:

TAG:Django(框架) | Python |