Django后端开发入门-Task03

P08 DRF QuerySet和Instance

引言

在Django Rest Framework(DRF)中,QuerySet和Instance是两个重要的概念,它们在处理数据时具有不同的作用和用途。本篇博客将深入介绍QuerySet和Instance的概念、区别以及使用方法,帮助开发者更好地理解和应用它们。

QuerySet:数据集合的操作工具

什么是QuerySet?

QuerySet是DRF中的一个核心概念,它是由Model.objects方法返回的,用于在数据库中执行查询操作并返回满足特定条件的对象集合。QuerySet实际上是一种灵活的、惰性的查询表达式,可以用于过滤、排序、聚合等操作。

常用的QuerySet操作方法

  1. filter()

    filter()方法用于返回符合特定条件的所有数据,例如:Goods.objects.filter(category=goods_category),会返回符合指定分类的所有商品。

  2. get()

    get()方法类似于filter(),但是用于返回符合条件的单个对象。需要注意的是,如果有多个满足条件的对象,get()方法会引发异常。

  3. all()

    all()方法返回模型的所有对象,相当于不带任何条件的filter()方法。

  4. delete()

    delete()方法可以删除符合条件的所有对象,如示例中的删除商品分类操作。

  5. update()

    update()方法用于更新符合条件的所有对象的特定字段值。

  6. create()

    create()方法是save()方法的快捷方式,用于创建并保存新的对象。

  7. count()

    count()方法返回符合条件的对象数量。

  8. order_by()

    order_by()方法可以对返回的对象进行排序,默认升序,添加负号则表示降序。

示例1:基本查询和过滤
假设我们有一个商品模型Goods,我们可以使用QuerySet来查询特定分类的商品:

# 查询所有分类为"电子产品"的商品
electronics_goods = Goods.objects.filter(category="电子产品")

示例2:排序和聚合
QuerySet还可以用于排序和聚合操作,比如按照价格升序排序:

# 查询所有商品,并按照价格升序排列
sorted_goods = Goods.objects.all().order_by('price')

示例3:统计数量
可以使用QuerySet来统计特定条件下的对象数量:

# 统计"家居用品"分类下的商品数量
home_goods_count = Goods.objects.filter(category="家居用品").count()

QuerySet的使用场景

QuerySet适用于需要查找多个对象、进行聚合操作或者执行复杂查询的场景。通过链式调用不同的操作方法,可以构建出灵活且高效的查询语句。

Instance:单个对象的操作工具

什么是Instance?

Instance是指Django模型的单个实例,即数据库中的一行数据。它用于对单个模型实例进行创建、更新或删除等操作。

常用的Instance操作方法

  1. 创建对象:Obj = Model(attr1=val1, attr2=val2),然后调用Obj.save()保存到数据库。

  2. 更新对象:通过Model.objects.get(id=xxx)获取对象,然后修改属性值,最后调用Obj.save()保存更改。

  3. 删除对象:同样使用Model.objects.get(id=xxx)获取对象,然后调用Obj.delete()删除该对象。

Instance的使用场景

Instance适用于单独对象的创建、修改和删除操作。当你只需要处理一个对象时,可以使用Instance进行针对性的操作,避免了处理整个QuerySet的复杂性。

QuerySet与Instance的区别

QuerySet和Instance之间的区别主要在于它们的操作对象和使用场景。QuerySet适用于需要查询多个对象、进行复杂操作的情况,而Instance适用于针对单个对象进行创建、更新和删除操作。通过合理的运用这两个概念,开发者可以更加高效地处理数据,提高开发效率。

结语

QuerySet和Instance是DRF中的两个重要概念,它们分别用于处理数据集合的操作和单个对象的操作。通过了解它们的特点、用途以及常用方法,开发者可以更好地应用于实际项目中,提高代码质量和开发效率。无论是查询多个对象还是处理单个实例,都可以通过合理使用QuerySet和Instance来达到更好的开发目标。


P09 Django APIView:构建灵活的API视图

引言

Django REST Framework(DRF)为我们提供了强大的工具来构建API视图,其中的核心工具之一就是APIView。与Django中的视图类类似,APIView为我们处理基于HTTP协议的请求和响应提供了灵活的方法。本篇博客将更深入地探讨APIView的概念、使用方法,并通过丰富的示例来帮助读者更好地理解如何构建灵活的API视图。

APIView的概念

什么是APIView?

APIView是DRF中的一个视图类,专门用于处理基于HTTP协议的请求和响应。它与Django中的视图类相似,但又有一些不同之处。APIView的目标是提供一种易于使用且高度可定制的方式来构建API视图,为开发者提供更多灵活性。

与传统的函数式视图不同,APIView将代码以面向对象的方式组织,使得视图逻辑更加清晰、结构更加易于维护。

如何使用APIView

在使用APIView构建API视图时,我们需要创建一个继承自APIView的类,并在其中实现相应的HTTP方法,如GET、POST、PUT等。

示例1:获取商品列表

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Goods
from .serializers import GoodsSerializer

class GetGoods(APIView):
    def get(self, request):
        goods = Goods.objects.all()
        serializer = GoodsSerializer(instance=goods, many=True)
        return Response(serializer.data)

在这个示例中,我们定义了一个GetGoods类,继承自APIView。在该类中,我们实现了GET方法用于获取所有商品的列表。首先,我们查询所有商品数据,然后使用序列化器对数据进行序列化,最后将序列化后的数据作为响应返回。

示例2:创建新商品

class CreateGoods(APIView):
    def post(self, request):
        request_data = {
    
    
            # 从请求数据中提取字段
            # ...
        }
        new_goods = Goods.objects.create(**request_data)
        serializer = GoodsSerializer(instance=new_goods)
        return Response(serializer.data)

在这个示例中,我们定义了一个CreateGoods类,同样继承自APIView。在该类中,我们实现了POST方法用于创建新的商品。我们从请求数据中提取字段,然后使用create()方法创建新的商品对象,最后对新对象进行序列化并返回响应。

示例3:根据ID获取商品详情

class GetSingleGoods(APIView):
    def get(self, request, pk):
        single_goods = Goods.objects.get(pk=pk)
        serializer = GoodsSerializer(instance=single_goods)
        return Response(serializer.data)

在这个示例中,我们定义了一个GetSingleGoods类,同样继承自APIView。在该类中,我们实现了GET方法,用于根据商品ID获取特定商品的详细信息。通过接受路径参数(pk),我们可以从数据库中查询对应ID的商品数据,然后对其进行序列化并返回。

APIView的灵活性与优势

APIView的灵活性在于它允许我们按照需求定义多个HTTP方法,使得API视图的逻辑更加清晰。无论是获取列表、创建对象,还是进行其他操作,我们都可以根据实际情况在一个类中完成。这样的代码组织方式不仅提高了代码的可读性,还使得代码的维护更加方便。

结语

Django REST Framework的APIView为我们提供了构建灵活的API视图的工具。通过多个示例,我们详细了解了如何使用APIView来构建不同功能的API视图,为我们的实际开发提供了指导。无论是获取列表、创建对象,还是其他操作,APIView都能为我们带来更好的开发体验,使得我们可以更加轻松地构建出符合需求的API接口。

参考资料:本文是根据datawhale开源Django后端开发入门做的笔记 https://github.com/Joe-2002/sweettalk-django4.2:

猜你喜欢

转载自blog.csdn.net/qq_42859625/article/details/132367868