Skip to main content

我的订单接口

在这节课中,我们将实现订单列表的功能。用户支付成功后,支付宝会跳转回指定页面,我们之前在settings.py中设置了返回地址。也就是

# returnURL
ALIPAY_RETURN_URL = '域名/orders/'

我们希望用户支付成功后直接跳转到订单列表页面,查看已购买的订单和订单的支付状态。

设置接口

首先我们需要设置一个URL来处理订单列表的请求。在urls.py中使用router.register()方法注册一个视图集,将其映射到orders路径上。

dx_movie/dx_movie/urls.py
from trade import views as trade_views

router.register(r'orders', trade_views.OrderViewSet)

创建OrderViewSet

接下来,我们需要创建一个OrderViewSet类来处理订单相关的操作。在之前的views.py文件中创建一个新的类,并继承自ModelViewSet类。

dx_movie/trade/views.py
from .serializers import CardSerializer, OrderSerializer
from utils.filters import OrderFilter


class OrderViewSet(viewsets.ModelViewSet):
queryset = Order.objects.order_by('-id')
serializer_class = OrderSerializer
filterset_class = OrderFilter

def get_permissions(self):
if self.request.method in SAFE_METHODS:
return [IsAuthenticated()]
else:
return [IsAdminUser()]

创建OrderSerializer

创建OrderSerializer, 代码如下:

dx_movie/trade/serializers.py
class OrderSerializer(serializers.ModelSerializer):
card = CardSerializer()

class Meta:
model = Order
fields = ['id','order_sn', 'pay_status', 'order_mount', 'created_at', 'card']

创建filter

在dx_movie/utils/路径下,创建一个filters.py文件,将所有的Filter类都统一放到这个文件下。filters.py文件代码如下:

dx_movie/utils/filters.py
from django_filters import rest_framework as filters
from movie.models import Movie
from trade.models import Order

class MovieFilter(filters.FilterSet):
movie_name = filters.CharFilter(lookup_expr='icontains')
category_id = filters.NumberFilter()
region = filters.NumberFilter()

class Meta:
model = Movie
fields = ['movie_name', 'category_id', 'region']

class OrderFilter(filters.FilterSet):
pay_status = filters.CharFilter(field_name='pay_status')
order_sn = filters.CharFilter(field_name='order_sn')

class Meta:
model = Order
fields = ['order_sn', 'pay_status']
warning

注意:将movie/views.py中的MovieFilter删除,导入utils.filters 。 修改后的代码如下:

dx_movie/movie/views.py
from utils.filters import 

class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
filterset_class = MovieFilter
permission_classes = [IsAdminUserOrReadOnly]

查询订单

现在我们可以使用接口来查询订单列表。发送一个GET请求到/orders/路径,即可获取所有订单的列表。可以使用查询参数来过滤订单,比如根据订单状态或订单号进行查询。

发送请求示例(查询状态为paying的订单):

GET /orders/?pay_status=paying

运行效果如下图所示。 图78-查询paying

发送请求示例(根据订单号查询订单):

GET /orders/?page=2

图78-翻页效果

结语

至此,我们已经完成了订单列表的接口实现。接下来,我们将继续实现前端展示这些数据的功能。在下节课中见!