django中使用filter()(即对QuerySet操作)时踩的坑

Posted xiaohaodeboke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django中使用filter()(即对QuerySet操作)时踩的坑相关的知识,希望对你有一定的参考价值。

代码伺候:

  先看如下代码:

例1:

         message = Message.objects.filter(pk=message_id2)

            message[0].id = message_id2
            message[0].content = content2
            message[0].message_type = message_type2
       print(message[0].id)
       print(message[0].content)

            message[0].save()

 

  可正常从QuerySet中读取数据,并打印出来,无误。可是无法将数据同步到数据库中。

  

      (1)all()返回的是QuerySet对象,程序并没有真的在数据库中执行SQL语句查询数据,但支持迭代,使用for循环可以获取数据。

         例如有Book表,其包含bookname,booknum两个属性, 如何使用Objects.all(),得到bookname和booknum的值

 (2)filter() 返回的是QuerySet对象,与all()相似,只是all()是查询所有数据,常用:filter表示‘ = ’,exclude表示’ != ’。

   (3)get()返回的是Model对象,类型为列表,说明使用get方法会直接执行sql语句获取数据。

  

  来看一个QuerySet对象:

  技术图片

 

 

  message = Message.objects.filter(pk=message_id2)

   message[0].content

  这样子确实可以读取到QuerySet中的数据,可是对QuerySet修改后的数据无法保存到数据库。

  例1中不要尝试通过message.save()的方式去同步数据到数据库,因为QuerySet不存在save()方法。

 

       正确写法如下: 

    要想同步到数据库中,需使用对象进行数据同步操作。

例2:

       message = Message.objects.filter(pk=message_id2).first()

           
            message.id = message_id2
            message.content = content2
            message.message_type = message_type2
            message.save()

 

以上是关于django中使用filter()(即对QuerySet操作)时踩的坑的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中相交两个查询集?

Django过滤器与排除

django:使用 Q 对象

Django Query 中的 PostgreSQL 编程错误

django model 条件过滤 queryset.filter(**condtions) 用法

通过 django 查询使用 Redshift 的原生“AT TIMEZONE”?