zoukankan      html  css  js  c++  java
  • [python][django学习篇][6]操作数据库

    1. 查询(取)数据
      • >>> 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
        View Code

        退出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>
        >>>
        View Code

        此外我们在创建文章时提到了通过 get 方法来获取数据,这里 all 方法和 get方法的区别是:all 方法返回全部数据(对象),是一个类似于列表的数据结构(QuerySet); get 返回一条记录数据(一个对象),如有多条记录或者没有记录,get方法均会抛出相应异常。all相当于select * from table,  get相当于select * from table where ** limit 1;

    2. 改数据
      • >>> 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 方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。TagPost 的修改也一样。

    3. 删除数据
      • >>> 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 已经被删除了。

  • 相关阅读:
    html 中 #include file 的用法
    人人网FED CSS编码前端开发规范
    (转载)css垂直水平居中的整理
    CSS负边距自适应布局三例
    (转载)无缝滚动图片的js和jquery两种写法
    用css3实现鼠标移进去当前亮其他变灰
    应急响应
    扫描工具介绍
    入侵检测
    安全防护与加固
  • 原文地址:https://www.cnblogs.com/liuzhipenglove/p/7339318.html
Copyright © 2011-2022 走看看