Django開發過程當中對錶(model)的增刪改查是最經常使用的功能之一,本文介紹筆者在使用model update過程當中遇到的那些事mysql
[ 運行環境:Django2.0 ]web
假如咱們的表結構是這樣的sql
class User(models.Model):
username = models.CharField(max_length=255, unique=True, verbose_name='用戶名')
is_active = models.BooleanField(default=False, verbose_name='激活狀態')
複製代碼
那麼咱們修改用戶名和狀態可使用以下兩種方法:數據庫
方法一:django
User.objects.filter(id=1).update(username='nick',is_active=True)
複製代碼
方法二:json
_t = User.objects.get(id=1)
_t.username='nick'
_t.is_active=True
_t.save()
複製代碼
方法一適合更新一批數據,相似於mysql語句update user set username='nick' where id = 1
後端
方法二適合更新一條數據,也只能更新一條數據,當只有一條數據更新時推薦使用此方法,另外此方法還有一個好處,咱們接着往下看bash
咱們一般會給表添加三個默認字段架構
auto_now_add
屬性,建立記錄時會自動填充當前時間到此字段auto_now
屬性,當記錄發生變化時填充當前時間到此字段就像下邊這樣的表結構前後端分離
class User(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間')
username = models.CharField(max_length=255, unique=True, verbose_name='用戶名')
is_active = models.BooleanField(default=False, verbose_name='激活狀態')
複製代碼
當表有字段具備auto_now
屬性且你但願他能自動更新時,必須使用上邊方法二的更新,否則auto_now字段不會更新,也就是:
_t = User.objects.get(id=1)
_t.username='nick'
_t.is_active=True
_t.save()
複製代碼
目前主流的web開放方式都講究先後端分離,分離以後先後端交互的數據格式大都用通用的jason型,那麼如何用最少的代碼方便的更新json格式數據到數據庫呢?一樣可使用以下兩種方法:
方法一:
data = {'username':'nick','is_active':'0'}
User.objects.filter(id=1).update(**data)
複製代碼
auto_now
屬性字段的值方法二:
data = {'username':'nick','is_active':'0'}
_t = User.objects.get(id=1)
_t.__dict__.update(**data)
_t.save()
複製代碼
auto_now
字段的值__dict__
方法方法三:
_t = User.objects.get(id=1)
_t.role=Role.objects.get(id=3)
_t.save()
複製代碼
假如咱們的表中有Foreignkey外鍵時,該如何更新呢?
class User(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間')
username = models.CharField(max_length=255, unique=True, verbose_name='用戶名')
is_active = models.BooleanField(default=False, verbose_name='激活狀態')
role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, verbose_name='角色')
複製代碼
方法一:
User.objects.filter(id=1).update(role=2)
複製代碼
User.objects.filter(id=1).update(**{'username':'nick','role':3})
複製代碼
方法二:
_role = Role.objects.get(id=2)
User.objects.filter(id=1).update(role=_role)
複製代碼
_role = Role.objects.get(id=1)
User.objects.filter(id=1).update(**{'username':'nick','role':_role})
複製代碼
方法三:
_t = User.objects.get(id=1)
_t.role=Role.objects.get(id=3)
_t.save()
複製代碼
"User.role" must be a "Role" instance
_t = User.objects.get(id=1)
_t.__dict__.update(**{'username':'nick','role_id':2})
_t.save()
複製代碼
_id
,例如:{'role_id':3}假如咱們的表中有ManyToManyField字段時更新又有什麼影響呢?
class User(models.Model):
create_time = models.DateTimeField(auto_now_add=True, verbose_name='建立時間')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新時間')
username = models.CharField(max_length=255, unique=True, verbose_name='用戶名')
is_active = models.BooleanField(default=False, verbose_name='激活狀態')
role = models.ForeignKey(Role, on_delete=models.CASCADE, null=True, verbose_name='角色')
groups = models.ManyToManyField(Group, null=True, verbose_name='組')
複製代碼
m2m更新:m2m字段沒有直接更新的方法,只能經過清空再添加的方法更新了
_t = User.objects.get(id=1)
_t.groups.clear()
_t.groups.add(*[1,3,5])
_t.save()
複製代碼
add()
:m2m字段添加一個值,當有多個值的時候可用列表,參照上邊例子
remove()
:m2m字段移除一個值,,當有多個值的時候可用列表,參照上邊例子
clear()
:清空m2m字段的值相關文章推薦閱讀