django 数据库操作-增、删、改、查(查会单独写一篇)
在本指南(以及参考资料)中,我们将参考以下模型,
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
复制代码
1 增加
要创建一个对象,用关键字参数初始化它,然后调用 save()
将其存入数据库
增加数据有两种方法。
1)save
通过创建模型类对象,执行对象的save()方法保存到数据库中。
>>> from .models import Blog
>>> book = Blog(
... name='python',
... tagline='ABCDEFG'
... )
>>> blog.save()
>>> blog
复制代码
2)create
通过模型类.objects.create()保存。
>>> Blog.objects.create(
... name='python2',
... tagline='abcdefg'
... )
复制代码
注意
保存 ForeignKey
和 ManyToManyField
字段*
更新 ForeignKey字段的方式与保存普通字段的方式相同——只需将正确类型的实例分配给相关字段。本例为Entry类的实例 entry 更新了 blog
属性,假设 Entry
和 Blog
的实例均已保存在数据库中(因此能在下面检索它们):
>>> from blog.models import Blog, Entry
>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
>>> entry.blog = cheese_blog
>>> entry.save()
复制代码
更新 ManyToManyField
字段有点不同——在字段上使用 add()
方法为关联关系添加一条记录。本例将 Author
实例 joe
添加至 entry
对象:
>>> from blog.models import Author
>>> joe = Author.objects.create(name="Joe")
>>> entry.authors.add(joe)
复制代码
2 修改
修改更新有两种方法
1)save
修改模型类对象的属性,然后执行save()方法
>>> blog = Blog.objects.get(name='hello')
>>> blog.name = 'aaa'
>>> blog.save()
>>> blog
<PeopleInfo: aaa> # 在幕后执行了update
复制代码
2)update
使用模型类.objects.filter().update() ,会返回受影响的行数
>>> Blog.objects.filter(name='abcdefg').update(name='python3')
1
复制代码
3 删除
通常,删除方法被命名为 delete()
。该方法立刻删除对象,并返回被删除的对象数量和一个包含了每个被删除对象类型的数量的字典。例子:
删除有两种方法
1)模型类对象delete
>>> e.delete()
(1, {'weblog.Entry': 1})
复制代码
你也能批量删除对象。所有 QuerySet
都有个 delete()
方法,它会删除 QuerySet
中的所有成员。
例如,这会删除 2005 发布的所有 Entry
对象:
>>> Entry.objects.filter(pub_date__year=2005).delete()
(5, {'webapp.Entry': 5})
复制代码
Entry.objects.all().delete()
复制代码