[TOC]
數(shù)據(jù)庫中增加數(shù)據(jù)的三個方法
一、類方法操作方式
修改模型定義類插龄,創(chuàng)建一個靜態(tài)的對象創(chuàng)建方法
class Users(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=50,unique=True,verbose_name="用戶名稱")
nickname = models.CharField(max_length=255,null=True,blank=True,verbose_name="用戶昵稱")
password = models.CharField(max_length=255,verbose_name="用戶密碼")
age = models.IntegerField(default=18,verbose_name="用戶年齡")
gender = models.BooleanField(default=True,verbose_name="用戶性別")
email = models.EmailField(verbose_name="用戶郵箱")
# birthday = models.DateTimeField(default=datetime.now())
#auto_now_add為第一次創(chuàng)建的時間,不會再改變了
# birthday = models.DateTimeField(auto_now_add=True)
#為每次更新的時間
birthday = models.DateTimeField(auto_now=True)
#第一種方式科展,需要使用類方法完成增加
#構(gòu)造一個對象均牢,返回一個對象
#靜態(tài)方法,可以直接被類型所調(diào)用
@classmethod
def add_user(cls,username,nickname,password,age,email):
return cls(username=username,nickname=nickname,password=password,age=age,email=email)
重新定義views.py中的處理函數(shù)
def register(request):
#定義用戶信息
username=...
...
...
user = models.Users.add_user(username=username,nickname=nickname,password=password,age=age,email=email)
#這個方法有Model提供才睹,可以保存自身model對象
user.save()
return HttpResponse("注冊界面")
二徘跪、類管理器你操作方式
通過使用 Django 提供的對象管理器 Manager,給每個模型類創(chuàng)建一個管理類如作者類型 User 的數(shù)據(jù)管理類為 User Manager砂竖,這也是符合面向?qū)ο箝_發(fā)思想的一種開發(fā)方式真椿,不同的類型負責(zé)不同的功能,互相協(xié)作完成整個功能乎澄。
在models.py文件中創(chuàng)建一個類型突硝,這是對應(yīng)model模型類的管理器類型,如User類的管理器UserManager:
#使用管理器的方式來完成數(shù)據(jù)操作
#首先為我們的model創(chuàng)建一個管理器類
class UserManager(models.Manager):
def add_user(self,username,password,nickname,age,email ):
user = self.create(username=username,password=password,nickname=nickname,age=age,email=email)
return user
# Create your models here.
class Users(models.Model):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=50,unique=True,verbose_name="用戶名稱")
nickname = models.CharField(max_length=255,null=True,blank=True,verbose_name="用戶昵稱")
password = models.CharField(max_length=255,verbose_name="用戶密碼")
age = models.IntegerField(default=18,verbose_name="用戶年齡")
gender = models.BooleanField(default=True,verbose_name="用戶性別")
email = models.EmailField(verbose_name="用戶郵箱")
# birthday = models.DateTimeField(default=datetime.now())
#auto_now_add為第一次創(chuàng)建的時間置济,不會再改變了
# birthday = models.DateTimeField(auto_now_add=True)
#為每次更新的時間
birthday = models.DateTimeField(auto_now=True)
userManager = UserManager()
之后在views.py視圖函數(shù)中直接調(diào)用Users對象的UserManager對象的add_user方法完成即可
def register(request):
#定義用戶信息
username = ...
...
...
user = models.Users.userManager.add_user(username=username,nickname=nickname,password=password,age=age,email=email)
print(user)
return HttpResponse("注冊界面")
第二種方式是基于面向?qū)ο蟮姆绞酵瓿山馇。瑸槊恳粋€model模型類構(gòu)建一個管理器對象,這種方式更符合面向?qū)ο蟮木幊陶阌冢褪菍ψ陨淼母鞣N操作(增刪改查)护盈,交給一個管理器完成,model 模型類只是定義屬性即可羞酗,而自身不會參與操作腐宋,推薦使用 **
對象屬性操作方式
實質(zhì)我們model類已經(jīng)繼承了Model這個類,根據(jù)第一種方式檀轨,我們知道Model類中存在一個save方法胸竞,所以我們也可以直接構(gòu)建對象肌括,使用這個方法完成操作躏精。
model.py不需要任何的操作,只在views.py文件中構(gòu)建對象舵揭,完后才能保存即可
def register(request):
#第三種讹挎,
user = models.Users(username=username,nickname=nickname,password=password,age=age,email=email)
user.save()
return HttpResponse("注冊界面")
問題:type object 'Users' has no attribute 'objects'
當(dāng)在shell中出現(xiàn)type object 'Users' has no attribute 'objects'的問題時校赤,可能是因為第二種和第三種方式出現(xiàn)了混合使用造成的吆玖,因為在shell中使用的就是第三種