美文网首页
django数据操作总结

django数据操作总结

作者: HC2 | 来源:发表于2021-05-10 18:04 被阅读0次

    模型:

    from django.db import models
    
    # Create your models here.
    
    class Author(models.Model):
        id = models.AutoField(primary_key=True)  
        name = models.CharField(max_length=32) 
        update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    
    class Book(models.Model):
        id = models.AutoField(primary_key=True)  # AutoField唯一主键
        user = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者')
        name = models.CharField(max_length=512)
        field = models.CharField(max_length=512)
    

    一、往表中插入数据

    • 方法一

      obj = Author(name='曹雪芹')
      obj.save()

    • 方法二

       obj = Author.objects.create(name='施耐庵')
       print(obj.name,obj.id)
      
    • 包含外键

      author = Author.objects.get(id=1)
      obj = Book.objects.create(name='红楼梦',field='经典',user=author)
      
      author = Author.objects.get(id=1)
      obj = Book.objects.create(name='红楼梦2',field='经典',user_id=author.id)
      
    • 多对多

    模型:

    class Member(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
    
    
    class Student(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        members = models.ManyToManyField(Member,null=True)
    

    1)、

    s = Student.objects.get(id = 1)
    s.members.add(1,2,3)
    

    2)、

    s = Student.objects.get(id = 1)
    m = Member.objects.get(id=1)
    m2 = Member.objects.get(id=2)
    s.members.add(m,m2)
    

    3)、批量添加

    s = Student.objects.get(id = 1)
    m = Member.objects.all()
    s.members.add(*m)
    

    4)、方向添加

    s = Student.objects.all()
    m = Member.objects.get(id=1)
    m.student_set.add(*s)
    

    二、修改表数据

    • 将id=1的数据的name字段修改为:曹雪芹2

      方法一

        obj = Author.objects.get(id=1)
        obj.name = '曹雪芹2'
        obj.save()
      

      方法二

       Author.objects.filter(id=1).update(name='曹雪芹3')
      

    当 Author.objects.get(id=1).update(name='曹雪芹3') 写法时会报错:AttributeError: 'Author' object has no attribute 'update'

    方法二适合更新一批数据,类似于mysql语句update Author set name='曹雪芹' where id = 1

    方法一适合更新一条数据,也只能更新一条数据

    当表有字段具有auto_now属性且你希望他能自动更新时,必须使用上边方法一的更新,不然auto_now字段不会更新,如方法二 Author表的update_time不会被更新

    使用方法二更新auto_now可使用一下方法进行更新

    from datetime import datetime
    obj = Author.objects.filter(id=1).update(name='曹雪芹3',update_time=datetime.now())
    
    • json/dict类型数据更新字段

    方法一

        data = {'name':'曹雪芹3','update_time':datetime.now()}
        obj = Author.objects.filter(id=1).update(**data)
    

    方法二

        data = {'name':'曹雪芹3','update_time':datetime.now()}
        obj = Author.objects.get(id=1)
        obj.__dict__.update(**data)
        obj.save()
    
    • ForeignKey字段更新

    方法一

     User.objects.filter(id=1).update(role=2)
    

    方法二

    obj = Book.objects.filter(id=1).update(user_id=4)
    

    方法三

    author = Author.objects.get(id=1)
    obj = Book.objects.filter(id=1).update(user=author)
    

    方法四

    _t = Book.objects.get(id=1)
    _t.user=Author.objects.get(id=3)
    _t.save()
    
    • ManyToManyField字段更新

    模型:

    class Member(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
    
    
    class Student(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        members = models.ManyToManyField(Member,null=True)
    

    多对多没有直接更新的方法,只能通过清空再添加的方法更新了

    一、删除单个

    s = Student.objects.get(id = 1)
    s.members.remove(1)
    s.members.add(1)  #再添加
    

    二、批量删除

    s = Student.objects.get(id = 1)
    s.members.remove(2,3)
    s.members.add(2,3) #再添加
    

    或者:

    s = Student.objects.get(id = 1)
    m = Member.objects.all()
    s.members.remove(*m)
    s.members.add(*m)  #再添加
    

    三、删除表数据

    1)、

    b =  Book.objects.get(id=1)
    b.delete()
    

    2)、多对多清除关联关系

    指定student清空member

    s = Student.objects.get(id = 1)
    m = Member.objects.all()
    s.members.remove(*m)
    

    或者

    s = Student.objects.get(id = 1)
    s.members.clear()
    

    四、查询数据

    • 查询单个数据

       b =  Book.objects.get(id=2)
       print(b)
       Book object (2)
      

      当数据不存在时会报错
      demo_app.models.DoesNotExist: Book matching query does not exist.

        b =  Book.objects.filter(id=2)
        print(b)
        <QuerySet [<Book: Book object (2)>]>
      

    不存在时返回为空

        b =  Book.objects.filter(id=1)
        print(b)
        <QuerySet []>
    
    • 检索所有对象

        b =  Book.objects.all()
        print(b)
      
    • 查询前五条数据

       b =  Book.objects.all()[:5]
      
    • 子表查询主表

    模型:

    class Author(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
        groups = models.ManyToManyField(Group,null=True,verbose_name='用户分组')
    
    
    class Book(models.Model):
        id = models.AutoField(primary_key=True)  # AutoField唯一主键
        user = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者',related_name='books')
        name = models.CharField(max_length=512)
        field = models.CharField(max_length=512)
    

    1)、查询书名为'红楼梦'的作者

    b = Book.objects.get(name='红楼梦')
    user = b.user
    print(user.name)
    

    2)、查询作者为'曹雪芹'的书

    b = Book.objects.filter(user__name='曹雪芹')
    print(b)
    

    或者:

    user = Author.objects.get(name='曹雪芹')
    book = user.book_set.all()
    print(book)
    

    或者:

    user = Author.objects.get(name='曹雪芹')
    book = user.books.all()
    print(book)
    

    books为: related_name='books'的 books

    • exclude(**kwargs)返回除了根据指定参数查询出来结果的QuerySet

    查询出name='曹雪芹'外的数据

    user = Author.objects.exclude(name='曹雪芹')
    print(user)
    
    • 链式过滤

    相关文章

      网友评论

          本文标题:django数据操作总结

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