美文网首页
Django 对数据库的增删改及自定义管理类

Django 对数据库的增删改及自定义管理类

作者: 上帝大人 | 来源:发表于2019-04-24 14:22 被阅读0次

对数据库的增删改

增加一条数据

  • 编译器的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,则不创建这张表。其他的属性可以搜一哈。

相关文章

网友评论

      本文标题:Django 对数据库的增删改及自定义管理类

      本文链接:https://www.haomeiwen.com/subject/azjugqtx.html