DRF_Django实现指定条件Queryset查询集放所有查询的前面在前

DRF当前登陆用户数据往前放,两个Queryset集合排序合并后保持原来排序, 解决使用queryset = queryset1|queryset 连接导致原有顺序错乱。

Django模型

class Book(models.Model):
    """书名"""
    title = models.CharField(max_length=255, verbose_name='书名')
    num = models.IntegerField(verbose_name='数量')
    name = models.ForeignKey(User,max_length=255,  on_delete=models.CASCADE, blank=True,verbose_name='logo的url')
    price = models.CharField(max_length=255,verbose_name='价格')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')

    class Meta:
        verbose_name_plural = '图书'
        db_table = 'books'
        ordering = ('id',)

    def __str__(self):
        return str(self.name)

序列化器

class BookSerializers(serializers.ModelSerializer):
    """图书表序列化"""
    username = serializers.SerializerMethodField()

    class Meta:
        model = Book
        fields = '__all__'
    def get_username(self,obj):
        return obj.name.username

试图filter_queryset集合完成重新拼接

使用queryset = chain(queryset1, queryset2)完成有序拼接
from itertools import chain

from django.db.models import QuerySet
from django.shortcuts import render

# Create your views here.
from rest_framework.filters import OrderingFilter
from rest_framework.viewsets import ModelViewSet
from app1.models import Book
from app1.seleialize import BookSerializers


class BooksModelViewSet(ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    filter_backends = [OrderingFilter]
    ordering_fields = ('id', 'num', 'price')

    def filter_queryset(self, queryset):
        # 排序
        queryset = super().filter_queryset(queryset)
        # 获取当前用户
        user = self.request.user
        # 获取当前用户记录
        queryset1 = queryset.filter(name=user)
        # 获取除了当前用户的记录
        queryset2 = queryset.exclude(name=user)
        拼接
        queryset = chain(queryset1, queryset2)
        return queryset

路由

http://127.0.0.1:8000/app1/book/?ordering=num,-price
字段num升序,当num相同时,按照price降序排序

实现

HTTP 200 OK
Allow: GET, POST, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

[
    {
        "id": 12,
        "username": "root",
        "title": "计算机组成原理",
        "num": 33,
        "price": "98",
        "create_time": "2021-11-15T09:19:39.950932",
        "name": 2
    },
    {
        "id": 9,
        "username": "root",
        "title": "概率统计",
        "num": 33,
        "price": "45",
        "create_time": "2021-11-12T09:30:15.763232",
        "name": 2
    },
    {
        "id": 8,
        "username": "root",
        "title": "线性代数",
        "num": 55,
        "price": "45",
        "create_time": "2021-11-12T09:30:04.173884",
        "name": 2
    },
    {
        "id": 7,
        "username": "root",
        "title": "高等数学",
        "num": 88,
        "price": "222",
        "create_time": "2021-11-12T09:29:46.058903",
        "name": 2
    },
    {
        "id": 3,
        "username": "admin",
        "title": "C",
        "num": 16,
        "price": "47",
        "create_time": "2021-11-12T09:28:28.952346",
        "name": 1
    },
    {
        "id": 2,
        "username": "admin",
        "title": "java",
        "num": 24,
        "price": "58",
        "create_time": "2021-11-12T09:28:09",
        "name": 1
    },
    {
        "id": 1,
        "username": "admin",
        "title": "Python",
        "num": 32,
        "price": "59",
        "create_time": "2021-11-12T09:27:36.402378",
        "name": 1
    },
    {
        "id": 4,
        "username": "admin",
        "title": "javascript",
        "num": 33,
        "price": "67",
        "create_time": "2021-11-12T09:28:42.322505",
        "name": 1
    },
    {
        "id": 5,
        "username": "lidong",
        "title": "大学英语1",
        "num": 34,
        "price": "45",
        "create_time": "2021-11-12T09:29:07.834414",
        "name": 3
    },
    {
        "id": 6,
        "username": "lidong",
        "title": "大学英语2",
        "num": 54,
        "price": "65",
        "create_time": "2021-11-12T09:29:21.960366",
        "name": 3
    },
    {
        "id": 10,
        "username": "admin",
        "title": "C语言——谭浩强版",
        "num": 57,
        "price": "59",
        "create_time": "2021-11-12T09:30:37.685550",
        "name": 1
    },
    {
        "id": 11,
        "username": "admin",
        "title": "Java——黑马科技",
        "num": 68,
        "price": "90",
        "create_time": "2021-11-12T09:31:06.174506",
        "name": 1
    }
]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值