美文网首页
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