模型:
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)
- 链式过滤
网友评论