码迷,mamicode.com
首页 > 其他好文 > 详细

13.Django(单表操作:增、简单查询、删、改、补天字段问题)

时间:2020-05-28 16:28:13      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:upd   批量创建   删除表   报错   返回   one   loaded   prim   name   

单表操作—增

  • 再次明确orm与mysql的对应关系

    orm                      mysql
    类                       表
    类中的属性                 表的字段
    实例化对象                 行记录(一行数据)
  • 方式1(不常用)

    def create(request):
    stu_obj = models.Student(
    name = ‘牧羊小董‘,
    age=21
    ) # 实例化一个对象
    stu_obj.save() # 将和这个数据添加到数据库中
      return HttpResponse("<h1>添加数据成功</h1>")
       
    操作代码都是写道views相应的函数里面的,一下只写操作代码,位置都是一样的
  • 方式2(常用)

    models.Student.objects   # objects可以称为一个控制器,这个控制器可以调用增删改查等其他方法,非常重要
    ?
    stu_obj = models.Student.objects.create(
    name=‘牧羊小董‘,
    age=21
    )
    print(stu_obj) # Student object
    # 通过万能的点获取它的属性
    print(stu_obj.id) # 这条数据当前的id值
    print(stu_obj.name) # 牧羊小董
    print(stu_obj.age) # 21

    重要的点:以后我们对类实例化的对象比如上面的stu_obj,我们都称之为models对象

  • 方式3(批量创建)

    现在有200条行数据,我想将在这200条行数据插入到对应的表中,首先想到的就是for循环,循环插入。循环插入,你插入一次,就是与数据库交互一次,就会产生一次IO,这样循环插入的数据量越大,IO越多,效率越低。

    # 批量创建
    list1 = [models.Student(name=f‘牧羊小董{i}‘, age=21 + i) for i in range(20)]
    obj = models.Student.objects.bulk_create(list1)
    print(obj)
    ?
    """
    打印的obj结果是:
    [<Student: Student object>, <Student: Student object>, <Student: Student object>,
    ...
    <Student: Student object>, <Student: Student object>, <Student: Student object>]
    """
  • 方式4(创建更新)

    有则更新,无则添加

    # 有的
    models.Student.objects.update_or_create(
    name =‘牧羊小董0‘,   # 筛选判断条件
    defaults={
    ‘age‘: 18,
    }
    )
    ?
    ?
    # 没有的
    models.Student.objects.update_or_create(
    name=‘小计‘,
    defaults={
    ‘age‘: 17,
    }
    )

 

单表操作— 简单查询

  • 查询所有 all()

    def all(request):
      query_set = models.Student.objects.all()
      print(query_set) # 返回一个QuerySet对象
      print(query_set[1:5]) # 可以使用切片
      for obj in query_set:
    print(obj.name)   # 遍历QuerySet对象,通过点获取里面每个models对象的name属性
      return HttpResponse("<h1>数据查询完毕</h1>")
    ?
    ?
    # 测试__str__功能
    class Student(models.Model):
      id = models.AutoField(primary_key=True)
      name = models.CharField(max_length=16)
      age = models.IntegerField()
    ?
      def __str__(self):
          return self.name
    ?
    def all(request):
      query_set = models.Student.objects.all()
      for obj in query_set:
          print(obj)   # 遍历QuerySet对象,现在就直接打印name属性了
      return HttpResponse("<h1>数据查询完毕</h1>")
    ?
    操作代码都是写道views相应的函数里面的,一下只写操作代码,位置都是一样的

    另一个非常重要的对象:QuerSet对象,他是一个类似于列表的容器,可迭代的,里面的元素就是一个个的models对象。

  • 按条件查询 filter ()

    models.类名.objects.filter(条件) 返回的是QuerySet对象

    query_set = models.Student.objects.filter(age=18)
    print(query_set)
    ?
    # 无论查询的结果是一个还是多个,都是返回QuerySet对象
  • 按条件查找 get()

    返回的都是models对象

    get() 按条件查找,返回一个models对象,通过get查询的结果有且只能有一个

    面试考过报错原因以及分析

    obj = models.Student.objects.get(id=2)
    print(obj)   # 依照条件查询结果只有一个不报错
    ?
    obj = models.Student.objects.get(age=20)
    print(obj)   # 依照条件查询结果可能是多个就会报错
    报错:get() returned more than one Student -- it returned [这里是查询到的总数量]!
    ?
    obj = models.Student.objects.get(id=2000)
    print(obj)   # 依照条件查询结果可能没有对应结果也会报错
    报错:Student matching query does not exist.

 

单表操作—删

分为两种情况的删除 一个是QuerySet、一个是models

  • QuerySet对象

    def del_(request):
        models.Student.objects.filter(age=20).delete()
        return HttpResponse("<h1>数据删除完毕</h1>")
  • models对象

    def del_(request):
        models.Student.objects.get(id=2).delete()
        return HttpResponse("<h1>数据删除完毕</h1>")
  • 表中数据全部删除

    def del_(request):
        models.Student.objects.all().delete()
        return HttpResponse("<h1>数据删除完毕</h1>")

 

单表操作—改

  • 方式1(update_or_create)

    models.Student.objects.update_or_create(
    	name =‘牧羊小董0‘,   # 筛选判断条件
    	defaults={
    		‘age‘: 18,
    	}
    )
  • 方式2(update)

    models.Student.objects.filter(id=1).update(name=‘牧羊小董‘)

 

补充字段

坑:给已经创建好并有数据的表添加新字段的问题

我们已经创建好一个Student表了,并且也往里面插入了一些数据,此时我们要想给Student表添加一个新的字段,比如sex字段,怎么做?

先在models.py里面的Student类里面写上sex字段

class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=16)
    age = models.IntegerField()
    sex = models.CharField(max_length=6)

    def __str__(self):
        return self.name

然后你在Terminal里面输入命令:

python manage.py makemigrations

然后显示下面的结果:

技术图片

 

 

技术图片

原因:原表已经存在数据了,你想新增字段,那么原表的这些数据对应的这个字段的内容是什么?

你也没有设置这个字段默认为null,所以产生了歧义。

解决方式:

1、选择1:退出,咱们去对sex字段设置一个默认值。

sex = models.CharField(max_length=6, default=‘male‘)

2、选择2:退出。咱们去对sex字段设置一个参数:null=True

sex = models.CharField(max_length=6, null=True)

3、删除表重新构建表结构

然后重新打开Terminal,输入命令:

python manage.py makemigrations
python manage.py migrate

 

13.Django(单表操作:增、简单查询、删、改、补天字段问题)

标签:upd   批量创建   删除表   报错   返回   one   loaded   prim   name   

原文地址:https://www.cnblogs.com/muyangxiaodong/p/12981312.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!