【问题标题】:Django rest framework : how can I filter queryset in range?Django 休息框架:如何过滤范围内的查询集?
【发布时间】:2021-11-06 22:03:00
【问题描述】:

我需要过滤范围内的获取请求中的数据:

这是我的代码:

模型.py

class MainModel(TimeStampedModel):
    model_name = models.CharField(_("model_name"), max_length=240)        
    model_price = models.DecimalField(_("model_price"), max_digits=8)

class ModelAdditionalData_1(TimeStampedModel):
    model_id = models.OneToOneField(
        Model,
        verbose_name=_('related model'),
        on_delete=models.CASCADE,
        related_name='model_water_flow_data1',
        related_query_name='model_water_flow_data1'
    )
    model_param_1 = models.models.DecimalField(_("model_param_1"), max_digits=8)

class ModelAdditionalData_2(TimeStampedModel):
    model_id = models.OneToOneField(
        Model,
        verbose_name=_('related model'),
        on_delete=models.CASCADE,
        related_name='model_water_flow_data2',
        related_query_name='model_water_flow_data2'
    )
    model_param_2 = models.models.DecimalField(_("model_param_2"), max_digits=8)

view.py:

class ModelsViewSet(ReadOnlyModelViewSet, GenericViewSet):
    serializer_class = ModelsSerializer

    def get_queryset(self):
    model_param_1 = self.request.query_params.get('model_param_1')
    model_param_2 = self.request.query_params.get('model_param_2')

    filters = {}
    if model_param_1:
        filters['model_water_flow_data1__model_param_1'] = model_param_1
    if model_param_2:
        filters['model_water_flow_data2__model_param_2'] = model_param_2

    if filters:
        return MainModel.objects.filter(**filters)

    return MainModel.objects.all()

如何应用我的过滤器来过滤范围内的数据?例如,我不会按 model_param_1 过滤 1 和 10 之间的数据。

【问题讨论】:

标签: django django-models django-rest-framework django-queryset


【解决方案1】:

过滤器可以这样构建以覆盖一个范围:

filters = {}

if model_param_1:
    filters['model_water_flow_data1__model_param_1__gte'] = 1
    filters['model_water_flow_data1__model_param_1__lte'] = 10

if model_param_2:
    filters['model_water_flow_data1__model_param_2__gte'] = 1
    filters['model_water_flow_data1__model_param_2__lte'] = 10

MainModel.objects.filter(**filters)

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 2022-01-22
    • 2016-02-01
    • 1970-01-01
    相关资源
    最近更新 更多