Django从URL参数过滤日期范围返回空的queryset

3df52oht  于 2023-05-30  发布在  Go
关注(0)|答案(2)|浏览(166)

我目前正在尝试使用get_queryset在基于泛型类的视图上从url参数进行日期范围过滤,但是在进行日期范围过滤后,我收到了一个空数组。这有点奇怪,因为我可以打印查询集,但不能返回它。
url参数:http://127.0.0.1:8000/budget-filter?budget_date=2023-6-7&budget_end_date=2023-6-13
下面是views.py

@permission_classes([IsAuthenticated])
class BudgetFilter(generics.ListAPIView):

    serializer_class = BudgetSerializer
    paginator = None
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['budget_category', 'budget_account', 'budget_date', 'budget_end_date']

    def get_queryset(self):

        user = self.request.user.username
        budget_date_url = self.request.GET.get('budget_date', None)
        budget_end_date_url = self.request.GET.get('budget_end_date', None)

        if budget_date_url is not None:
            queryset = BudgetModel.objects.filter(current_user = user).filter(budget_date__gte=budget_date_url, budget_date__lte=budget_end_date_url).values()
            print (queryset)
            return queryset

下面是serializers.py

class BudgetSerializer(serializers.ModelSerializer):
    class Meta:
        model = BudgetModel
        fields = '__all__'

models.py

class BudgetModel(models.Model):
    budget_description = models.CharField(max_length=150)
    budget_price = models.DecimalField(max_digits=35, decimal_places=2)
    budget_account = models.CharField(max_length=100)
    budget_category = models.CharField(max_length=100)
    budget_currency = models.CharField(max_length=150)
    budget_date = models.DateField(auto_now=False)
    budget_end_date = models.DateField(auto_now=False, blank=True)
    budget_display_date = models.CharField(max_length=15)
    current_user = models.CharField(max_length=200)

关于print (queryset)

<QuerySet [{'id': 20, 'budget_description': 'adassd', 'budget_price': Decimal('22.00'), 'budget_account': 'Main', 'budget_category': 'Education', 'budget_currency': 'AED', 'budget_date': datetime.date(2023, 6, 10), 'budget_end_date': datetime.date(2023, 6, 10), 'budget_display_date': '10 Jun 2023', 'current_user': 'myname'}]>

我尝试使用不同的日期范围过滤方法,然而__gte和__lte方法似乎是一个做的伎俩。现在我可以打印查询集了,只是不能从函数中返回它。

uqxowvwt

uqxowvwt1#

嗯,.values()可能不会返回实际模型示例的信息,这可能会使序列化器失效。尝试删除它并直接获取查询:

if budget_date_url is not None:
  queryset = BudgetModel.objects.filter(
    current_user=user,
    budget_date__gte=budget_date_url,
    budget_date__lte=budget_end_date_url
    )
  print(queryset.query)
  return queryset
8yparm6h

8yparm6h2#

好吧,我不知道django-filter,但你可以使用一个简单的custom filterrange查找:

class BudgetFilter(generics.ListAPIView):
    queryset = BudgetModel.objects.all()
    ...

    def filter_queryset(self, queryset):
        user = self.request.user.username
        budget_date_url = self.request.GET.get("budget_date", None)
        budget_end_date_url = self.request.GET.get("budget_end_date", None)

        if budget_date_url is not None:
            queryset = BudgetModel.objects.filter(current_user=user).filter(
                budget_date__range=(budget_date_url, budget_end_date_url)
            )
        return queryset

也许你还想检查这两个参数的存在,以便过滤!

相关问题