详解Django的 get() 函数:处理 GET 请求

  • Post category:Python

get()函数是Django中常用的查询函数之一,主要作用是通过查询指定的Model对象集(Queryset)中的元素,返回一个单一的对象。它主要使用键值参数进行查询,如果查询到多个对象,将会抛出MultipleObjectsReturned异常,如果未查询到任何对象,将会抛出DoesNotExist异常。

下面进一步介绍get()函数的使用方法。

基本使用

在使用get()函数时,首先需要导入对应的Model对象,并获取到指定的Queryset对象:

from myapp.models import MyModel

objs = MyModel.objects.all()

接下来就可以调用get()方法进行查询了:

obj = objs.get(id=1)

上面的代码中,查询了MyModel对象集中id属性等于1的对象。如果查询成功,将会返回一个单独的对象。如果未查询到任何对象,将会抛出MyModel.DoesNotExist异常。如果查询到多个对象,将会抛出MyModel.MultipleObjectsReturned异常。

处理异常

由于get()函数可能会抛出多种异常,因此在使用时需要重点关注异常处理。一般来说,可以使用try-except进行异常处理,如下所示:

try:
    obj = objs.get(id=1)
except MyModel.DoesNotExist:
    # 未查询到对象时的处理逻辑
except MyModel.MultipleObjectsReturned:
    # 查询到多个对象时的处理逻辑

对于DoesNotExist异常,可以考虑返回一个空值或者提示用户未查询到对象。对于MultipleObjectsReturned异常,可能需要进一步调用filter()函数,改用多条查询语句来实现。

可选参数

除了键值参数外,get()函数还支持一些可选参数。其中,default参数表示未查询到对象时的默认返回值,如下所示:

obj = objs.get(id=1, default=None)

当查询未返回任何结果时,将会返回None

另一个可选的参数是using,它用于指定查询的数据库名称。例如:

obj = objs.get(id=1, using='mydb')

上面的代码将从名为mydb的数据库中查询记录,并返回匹配的单独对象。

示例

下面提供两个具体的实例,以便更好地理解get()函数的使用方法。

示例1

假如我们的Django项目中有一个Model对象Book,其中包含书籍的名称、作者、价格等信息。我们可以使用get()函数,查询价格最贵的书籍的作者信息。具体代码实现如下:

from myapp.models import Book

books = Book.objects.all()
most_expensive_book = books.order_by('-price').first()

if most_expensive_book:
    author = most_expensive_book.author
    print(f'The author of the most expensive book is {author}.')
else:
    print('The are no books in the database.')

在上面的代码中,首选查询整个Book对象集,并按照价格从高到低进行排序。接着,使用first()方法取得排序后的第一项,即最贵的书籍。最后,获取最贵书籍的作者信息,如果查询成功,将会打印出作者的名字。

示例2

假如我们的Django项目中有一个Model对象User,其中包含用户的姓名、年龄、性别等信息。我们可以使用get()函数,查询某个指定用户的信息。具体代码实现如下:

from myapp.models import User

try:
    user = User.objects.get(name='Alice', age=21)
    print(f'User {user.name} is {user.age} years old and their gender is {user.gender}.')
except User.DoesNotExist:
    print('Alice is not in the database.')
except User.MultipleObjectsReturned:
    print('There are multiple Alices in the database.')

在上面的代码中,我们通过使用get()函数,查询了名为Alice,年龄为21的用户的信息,并打印出查询结果。如果未查询到任何对象,将会提示用户Alice不在数据库中。如果查询到多个对象,将会提示用户存在多个Alice