对数据库的增删改
增加一条数据
- 编译器的ORM自动把save方法转化为数据库中的insert,来执行操作
下面是我们的定义的模型类,他在数据库中映射成了一张表,所以我们在插入对象的时候,其实就是添加了这个类的对象。
我们一般会把这些函数分开,为了后期的维护。所以我们在urls.py中再配置一个路由,
path(' cure ' , views.cure)
class BookInfo(models.Model):
btitle =models.CharField(max_length=20)
bdate = models.DateField()
bread =models.IntegerField(default=0) # 阅读量,默认为0
bcomment = models.IntegerField(default=0)#评论量,默认为0
isDelete = models.BooleanField(default=False)#逻辑删除
然后在views.py中定义一个cure函数
视图处理函数
,在里面定义一个对象,并为其属性赋值,然后调用对象的save()方法,完成对数据库的插入。
def cure(request):
book =BookInfo()
book.btitle='天龙八部'
book.bdate='2019-04-04'
#...
book.save()
return HttpResponse('执行结束!')
- 特别的,
如果插入含有外键的数据的时候,外键属性的值必须是一个对象,
一个与此表关联的外键属性的对象
。
- 代码如下:
def cure(request):
person = Person()
person.pname='郭靖'
person.pcommnet='降龙十八掌'
person.pgender=True
b= BookInfo.objects.get(btitle='天龙八部')
person.hbook=b
person.save()
return HttpResponse('执行结束')
改数据库中的数据
- 改的过程就是先取出这条数据,然后对他的属性进行重新赋值,在调用其save()方法完成 把红楼梦的时间改为1999-09-09
def cure(request):
book =BookInfo.objects.get(btitle = '红楼梦')
book.bdate='1999-09-09'
#...
book.save()
return HttpResponse('执行结束!')
删除数据表中的数据
比该数据库中的数据还要简单,查询到对象,调用对象的delete()完成删除。
自定义管理类!
一般,类都放在models.py中,所以我们自定义图书管理类也放在其中。
然后重写里面的方法,或者自定义方法,这些方法是类似与(BookInfo.objects.方法
)。
class BookManager(models.Manager):
def all(self):
return super().all().filter( isDelete=False ) #super()是调用父类中的方法。
#从这里我们可以看出来,我们删除的东西,有可能只是逻辑删除,你没查出来,但是它可能还存在于数据库中。
def addBook(self, bookname, pub_date):
book=self.model() #比较的秀的写法。
# book= BookInfo() #与上面那句等价
book.title=bookname
book.date= pub_date
book.save()
def delete(self,bookname):
pass
def search(self,date):
pass
然后在BookInfo中创建管理器的对象,否者,你不定义,他自动创建的是objects
#在BookInfo中
bookobjects= BookManager()
此时,默认的objects不会生效
- 实质上就是,我们定义了一个与objects这个对象同等级别的类,并且在里面重写all,filter,或者get,或者自定义一些方法。然后在模型类(BookInfo,PersonInfo)中实例化,用这个类创建一个对象,然后,在视图函数中就可以用
Bookinfo.实例化的对象名.自定义的函数或者重写的函数(参数)
,类似与默认的BookInfo.objects.get()。
元数据
- 在models.py中定义模型类,生成迁移文件,执行迁移,他会自动的帮你创建表,这个表的名字是默认的,一般是
应用名__模型类名
,如果要更改,可以在模型类中定义meta类,使其db_table=‘ 随便定义 ’。这样生成的表的名字就是你自己定义的了。
class BookInfo(models.Model):
class Meta:
db_table=' book '
pname=models.CharFiled(max-length=20)
- 这个Meta还有其他属性,例如managed,若他的属性为False,则不创建这张表。其他的属性可以搜一哈。
网友评论