1. 程式人生 > >Django對資料庫進行新增與更新

Django對資料庫進行新增與更新

先把models.py擺這兒

#models.py
class UserProfile(AbstractUser):
    '''
    繼承Django的AbstractUser 並向裡面新增兩條資料內容懷疑
    '''
    gender = models.CharField(max_length=6,choices=(('male','男'),('female','女')),default='female',verbose_name='性別')
    memo = models.TextField(null=True, blank=True,verbose_name='便籤')
    class Meta:
        verbose_name = '使用者資訊'
        verbose_name_plural = verbose_name #指定模型的複數形式是什麼,如果不指定Django會自動在模型名稱後加一個’s’

class UserTodo(models.Model):
    created_time = models.DateTimeField(default=datetime.now(),verbose_name='建立時間')
    user_id = models.ForeignKey(UserProfile,on_delete=models.C    ASCADE)  #設定外來鍵,關聯到UserProfile表
    # models.CASCADE表示若刪除某一使用者,則該使用者下的所有UserTodo也會被刪除
    ToDolist = models.CharField(max_length=255,verbose_name='todo')
    done = models.BooleanField(default=False,verbose_name='完成狀態')
    class Meta:
        verbose_name = '使用者自增資訊'
        verbose_name_plural = verbose_name

一、將資料儲存到資料庫中(在views.py中)

完成model後,在Terminal執行python manage.py makemigrations 生成資料庫。然後可以進行儲存操作

對於沒有沒有外來鍵的資料庫:

from .models import UserProfile
from django.contrib.auth.hashers import make_password
user_profile = UserProfile()
user_profile.username = username
user_profile.email = email
user_profile.password = make_password(password) #make_password是django自帶的給password重新編碼技術,儲存在資料庫中
user_profile.is_active = True #判斷使用者是否啟用
user_profile.save()

有外來鍵的資料庫

1、首先應先獲取關聯的資料庫的資訊,如果為使用者則為用的在資料庫中的ID

user_id = UserProfile.objects.get(username=request.user) #request.user表示當前登陸的使用者名稱稱,後臺實際上是使用者名稱
2、儲存到資料庫中
user_todo = UserTodo(ToDolist=todo,done=done,user_id=user_id,created_time=datetime.now()) 儲存到資料庫中時按照使用者名稱所在的id進行儲存
user_todo.save()

二、對資料庫進行更新及查詢的操作

動機是當用戶點選網頁上的X號是對資料庫中的done進行更新,更新為True。

一開始想著按照id進行更新,但是當用戶多了以後id與網頁上顯示的id肯定不相同。

經過我的苦苦思索,每個使用者中建立todo的時間肯定不相同,因此可以依據created_time可以進行搜尋,來對done進行更新。

說幹就幹!

1、先查詢我們想要的那一條資料

使用者的todo顯示在網頁上時是按照created_time進行了排序,因此在更新的時候也按照created_time進行排序,這樣子便不會出錯。

user_id = UserProfile.objects.get(username=request.user) #獲取當前登陸使用者的todo id(按照後臺的列印實際上為使用者名稱)
todo_query = UserTodo.objects.filter(user_email=user_id, done=False) #按照user_id、done進行對資料庫的篩選
#在UserTodo表中找出user_id以及該使用者下done=False的資料
#todo_query的型別為<class 'django.db.models.query.QuerySet'>
todo_query = todo_query.order_by("created_time")  # 按照截至日期按照從小到大的順序進行篩選,若要從大到小排序則("-created_time")

現在的結果是我們已經得到了該使用者名稱下的所有done=False的資料,並且已經完成了排序

接下來就是找到我們想要的那一條資料

todo_dict = todo_query.values("created_time") #經過values,得到created_time的那一列資料

型別依舊為QuerySet,但只有一種資料,即全部是created_time的資料,這時就可以提取我們想要的資料了

time_dict[3]['created_time'] #QuerySet中第四個名稱為created_time的資料(序號從0開始,因此3是第四個)3為網頁上元素的索引
列印print(time_dict[3]['created_time'])的結果為:2018-06-07 01:45:10.938825+00:00

到此已經完成資料的查詢。

2、對資料進行更新

已經是小菜一碟了hiahiahia。。。

按照上述查詢到的created_time,來找出當前使用者下符合這一個cteated_time 的記錄(肯定只有一條)

time_index = time_dict[id]['created_time'] #id為從前端傳過來的網頁上元素的id
User = UserTodo.objects.get(user_id=user_id,created_time=time_index)
User.done = True
User.save()
Done!