Django的get和filter的区别

本文探讨了Django ORM中get和filter方法的区别,包括返回值类型、异常处理、查询多条和单条数据的场景,以及如何在实际操作中合理选择。同时,介绍了如何使用filter方法进行批量更新和对象属性修改。
摘要由CSDN通过智能技术生成

创建数据

创建一个book表进行演示

from django.db import models


# Create your models here.
class Book(models.Model):
    title = models.CharField(verbose_name='书名', max_length=11)
    author = models.CharField(verbose_name='作者', max_length=11)
    age = models.IntegerField(verbose_name='年龄')

    class Meta:
        # 数据库表名
        db_table = 'book_test'

数据库中查看表

插入数据

查看数据库数据

get和filter区别

1.返回值

  • get的返回值是一个定义的model类的实例,即对象
  • filter的返回值是一个QuerySet的集合对象,可使用迭代或者遍历,切片等,但是不等于list类型(使用一定要注意)

 

2.异常

  • get:只有一条记录返回的时候才正常。所以get多用于查询主键字段或者具有唯一性约束的字段,当有多条记录或者没有记录返回时,使用get均会抛出异常。
  • filter:没有记录、有一条或者多条记录返回均不会抛出异常。(没有记录的时候,返回值是一个空集合)

使用get查询数据:

1.返回多条记录

In [15]: book = Book.objects.get(age=38)
---------------------------------------------------------------------------
MultipleObjectsReturned                   Traceback (most recent call last)
<ipython-input-15-231f3a63dc48> in <module>
----> 1 book = Book.objects.get(age=38)

D:\anaconda3\lib\site-packages\django\db\models\manager.py in manager_method(self, *args, **kwargs)  
     83         def create_method(name, method):
     84             def manager_method(self, *args, **kwargs):
---> 85                 return getattr(self.get_queryset(), name)(*args, **kwargs)
     86             manager_method.__name__ = method.__name__
     87             manager_method.__doc__ = method.__doc__

D:\anaconda3\lib\site-packages\django\db\models\query.py in get(self, *args, **kwargs)
    440             'get() returned more than one %s -- it returned %s!' % (
    441                 self.model._meta.object_name,
--> 442                 num if not limit or num < limit else 'more than %s' % (limit - 1),
    443             )
    444         )

MultipleObjectsReturned: get() returned more than one Book -- it returned 2!

2.没有返回数据时


In [16]: book = Book.objects.get(age=30)
---------------------------------------------------------------------------
DoesNotExist                              Traceback (most recent call last)
<ipython-input-16-9ea71ada6640> in <module>
----> 1 book = Book.objects.get(age=30)

D:\anaconda3\lib\site-packages\django\db\models\manager.py in manager_method(self, *args, **kwargs)  
     83         def create_method(name, method):
     84             def manager_method(self, *args, **kwargs):
---> 85                 return getattr(self.get_queryset(), name)(*args, **kwargs)
     86             manager_method.__name__ = method.__name__
     87             manager_method.__doc__ = method.__doc__

D:\anaconda3\lib\site-packages\django\db\models\query.py in get(self, *args, **kwargs)
    435             raise self.model.DoesNotExist(
    436                 "%s matching query does not exist." %
--> 437                 self.model._meta.object_name
    438             )
    439         raise self.model.MultipleObjectsReturned(

DoesNotExist: Book matching query does not exist.

使用filter查询时

返回多条数据

In [18]: book = Book.objects.filter(age=38)

In [19]: book
Out[19]: <QuerySet [<Book: Book object (2)>, <Book: Book object (4)>]>

In [20]: for item in book:
    ...:     print(item.title,item.author,item.age)
    ...:
Django jack 38
Django bob 38

没有返回数据

In [21]: book = Book.objects.filter(age=30)

In [22]: book
Out[22]: <QuerySet []>

3.对表的修改

(1)user.update()方法

这种方法只能配合filter方法进行使用:

In [23]: book = Book.objects.filter(age=38)

In [24]: book = Book.objects.filter(title='python')

In [25]: book.update(age=20)
Out[25]: 1

使用get方法会报错:

In [26]: book = Book.objects.get(title='python')

In [27]: book.update(age=23)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-27-8f910998b099> in <module>
----> 1 book.update(age=23)

AttributeError: 'Book' object has no attribute 'update'

(2)user.xx = xx, user.save()

In [30]: book = Book.objects.get(title='python')

In [31]: book.age = 25

In [32]: book.save()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ambitious_plus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值