首页 > 解决方案 > Django REST 框架 - 使用日期外部 Views.py 文件过滤查询参数

问题描述

我使用 REST 框架创建了我的“API”,现在尝试对其进行过滤。这就是我的 models.py 寻找 BookingStatement 模型的方式。

class BookingStatement(BaseModel):
    ticket_number = models.PositiveIntegerField(unique=True)
    booking = models.OneToOneField(Booking, on_delete=models.PROTECT)
    user_rate = AmountField()
    agent_rate = AmountField()
    total_amount = AmountField()

    class Meta:
        default_permissions = ()

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

预订是一对一键,因此预订模型具有以下属性。

class Booking(BaseModel):
    bus_seat = models.ManyToManyField(Seat)
    schedule = models.ForeignKey(Schedule, on_delete=models.PROTECT)
    boarding_point = models.ForeignKey(
        BoardingPoint,
        on_delete=models.PROTECT,
        null=True
    )
    remarks = models.JSONField(null=True, blank=True)
    contact = PhoneNumberField(null=True)
    booking_date_time = models.DateTimeField(auto_now_add=True)

    class Meta:
        default_permissions = ()
        verbose_name = 'Booking'
        verbose_name_plural = 'Bookings'

    def __str__(self):
        return '{}-{}'.format(self.user, self.customer_name)

我在 views.py 中使用了通用 ListAPIView,如下所示。

class BusCompanyTicketDetailView(generics.ListAPIView, BusCompanyMixin):
    serializer_class = serializers.TicketDetailResponseSerializer
    def get_queryset(self):
        travel_date = (int(self.request.query_params.get('booking_date')))
        print(booking_date)

        return usecases.ListBusCompanyTicketUseCase(date=#'what should i pass?'#).execute()

我使用 usecases.py 过滤 booking_date_time 与 url 如下。

http://127.0.0.1:8000/api/v1/ticket/list?booking_date=2021-1-29

所以我过滤预订时间的用例文件如下。

class ListBusCompanyTicketUseCase(BaseUseCase):
    def __init__(self, date:datetime):
        self._date = datetime

    def execute(self):
        self._factory()
        return self._booking_statements

    def _factory(self):
        self._booking_statements = BookingStatement.objects.filter(booking__booking_date_time=?? need to get date from views.)

问题是我不知道如何在我的用例中从 url 获取查询参数来过滤预订日期,任何帮助都会非常有帮助。

标签: pythondjangofilterdjango-queryset

解决方案


您应该使用django-filter来实现对视图集的过滤。这是你必须积累的一些知识,但是一旦你理解了它,你就可以用它做很多复杂的过滤逻辑。从长远来看,尝试自己实现过滤系统总是更加困难。作为起点,请查看官方文档:https ://www.django-rest-framework.org/api-guide/filtering/ 。对于过滤器,请查看有关 DRF 集成的文档:https ://django-filter.readthedocs.io/en/stable/guide/rest_framework.html 。


推荐阅读