- 查询(取)数据
-
>>> Category.objects.all()
<QuerySet [<Category: Category object>]>
>>> Tag.objects.all()
<QuerySet [<Tag: Tag object>]>
>>> Post.objects.all()
<QuerySet [<Post: Post object>]>
>>> Post.objects.all()objects
是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了all
方法,表示我们要把对应的数据全部取出来。可以看到all
方法都返回了数据,这些数据应该是我们之前存进去的,但是显示的字符串有点奇怪,无法看出究竟是不是我们之前存入的数据。为了让显示出来的数据更加人性化一点,我们为 3 个模型分别增加一个__str__
方法: -
blog/models.py from django.utils.six import python_2_unicode_compatible # python_2_unicode_compatible 装饰器用于兼容 Python2
@python_2_unicode_compatible
class Category(models.Model):
... def __str__(self):
return self.name @python_2_unicode_compatible
class Tag(models.Model):
... def __str__(self):
return self.name @python_2_unicode_compatible
class Post(models.Model):
... def __str__(self):
return self.title退出python manage.py shell,重新进入,再次查询
-
>>> from blog.models import Category, Tag, Post
>>> Category.objects.all()
<QuerySet [<Category: category test>]>
>>> Tag.objects.all()
<QuerySet [<Tag: tag test>]>
>>> Post.objects.all()
<QuerySet [<Post: title test>]>
>>> Post.ojbects.get(title="title test")
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: type object 'Post' has no attribute 'ojbects'
>>> Post.objects.get(title="title test")
<Post: title test>
>>>此外我们在创建文章时提到了通过
get
方法来获取数据,这里all
方法和get
方法的区别是:all
方法返回全部数据(对象),是一个类似于列表的数据结构(QuerySet);而get
返回一条记录数据(一个对象),如有多条记录或者没有记录,get
方法均会抛出相应异常。all相当于select * from table, get相当于select * from table where ** limit 1;
-
- 改数据
-
>>> c = Category.objects.get(name='category test')
>>> c.name = 'category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: test category new>]>首先通过
get
方法根据分类名name
获取值为 category test 到分类,修改它的name
属性为新的值 category test new,然后调用save
方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。Tag
、Post
的修改也一样。
-
- 删除数据
-
>>> p = Post.objects.get(title='title test')
>>> p
<Post: title test>
>>> p.delete()
(1, {'blog.Post_tags': 0, 'blog.Post': 1})
>>> Post.objects.all()
<QuerySet []>先根据标题
title
的值从数据库中取出Post
,保存在变量p
中,然后调用它的delete
方法,最后看到Post.objects.all()
返回了一个空的 QuerySet(类似于一个列表),表明数据库中已经没有 Post,Post 已经被删除了。
-