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