[python][django学习篇][6]操作数据库
- 查询(取)数据
-
>>> 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 已经被删除了。
-