OrderingFilter DRF

问题描述

我有一个模特:

class Trade(models.Model):
    name = models.CharField(max_length=255,unique=True)
    is_active = models.BooleanField('Active',default=True)
    is_deleted = models.BooleanField('Deleted',default=False)

views.py

class TradeViewSet(viewsets.ModelViewSet):
    queryset = Trade.objects.all()
    permission_classes = [permissions.IsAuthenticated]
    serializer_class = TradeSerializer
    filter_backends = [
        DjangoFilterBackend,CaseInsensitiveOrderingFilter,SearchFilter
    ]

过滤器 CaseInsensitiveOrderingFilter

class CaseInsensitiveOrderingFilter(OrderingFilter):
    """
    Custom filter to order case insensitive fields as CharField and TextField.
    To define filter it's needed to add char or text fields to list:
    ordering_case_insensitive_fields = ["field"]
    """
    def filter_queryset(self,request,queryset,view):
        ordering = self.get_ordering(request,view)
        insensitive_ordering = getattr(view,'ordering_case_insensitive_fields',())

        if ordering:
            new_ordering = []
            for field in ordering:
                if field.lstrip('-') in insensitive_ordering:
                    if field.startswith('-'):
                        new_ordering.append(Lower(field[1:]).desc())
                    else:
                        new_ordering.append(Lower(field).asc())
                else:
                    new_ordering.append(field)
            return queryset.order_by(*new_ordering)

        return queryset

和简单的序列化器

class TradeSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Trade
        fields = (
            'id','name','is_active','is_deleted',)
        read_only_fields = ('is_deleted','id')

我的 tests.py

class TradeAPITest(BaseAPITestCaseSetup):
    data = {
        'name': 'Trade Name 012000','is_active': True,}

    def setUp(self):
        super().setUp()
        self.Trade = Trade.objects.create(**self.data)
        factories.TradeFactory.create_batch(10)
        self.test_data = {
            'name': 'Trade Name 2',}
    
    def test_ordering_by_name_ascending(self):
        url = reverse('Trades-list') + '?ordering=name'
        response = self.client.get(url)
        response_results = response.json().get('results')
        expected_result = sorted(response_results,key=lambda i: i['name'].lower())
        self.assertEqual(response.status_code,status.HTTP_200_OK)
        self.assertEqual(response_results,expected_result)

    def test_ordering_by_name_descending(self):
        url = reverse('Trades-list') + '?ordering=-name'
        response = self.client.get(url)
        response_results = response.json().get('results')
        expected_result = sorted(
            response_results,key=lambda i: i['name'].lower(),reverse=True
        )
        self.assertEqual(response.status_code,expected_result)

我想测试订购是否正确,对于模型生成,我与Faker一起在工厂使用 本地一切正常。但是在某些情况下,当我推送到存储库时,我的测试不会通过管道。

self = <tests.Trades.test_Trades_base_views.TradeAPITest testMethod=test_ordering_by_name_descending>
    def test_ordering_by_name_descending(self):
        url = reverse('Trades-list') + '?ordering=-name'
        response = self.client.get(url)
        response_results = response.json().get('results')
        expected_result = sorted(
            response_results,status.HTTP_200_OK)
>       self.assertEqual(response_results,expected_result)
E       AssertionError: Lists differ: [{'id[451 chars]d': 57,'name': 'I process environmental story[386 chars]lse}] != [{'id[451 chars]d': 52,'name': 'Interview because data such d[386 chars]lse}]
E       
E       First differing element 5:
E       {'id': 57,'name': 'I process environmental story[38 chars]alse}
E       {'id': 52,'name': 'Interview because data such d[43 chars]alse}

我不知道是什么问题

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)