django-filter 在参数错误时返回空查询集

Posted

技术标签:

【中文标题】django-filter 在参数错误时返回空查询集【英文标题】:django-filter return null queryset when wrong parameters 【发布时间】:2021-06-02 17:53:25 【问题描述】:

我正在创建一个简单的 API。

models.py

class TestModel(models.Model):
    tenor = models.IntegerField(db_column="tenor_field")
    currency = models.CharField(max_length=6, db_column="currency_field")
    value = models.FloatField(db_column="value_field")

serializer.py

class TestSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = TestModel
        fields = [ 'tenor', 'currency', 'value']

views.py

class TestView(viewsets.ReadOnlyModelViewSet):
    queryset = TestModel.objects.all()
    serializer_class = TestSerializer
    filterset_fields  = ['tenor','currency']

当我打电话时

https://10.1.33.70/api/v1/base-rates/floating/?currency=**EUR**&tenor=**10**

我明白了

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

[
    
        "tenor": 10,
        "currency": "EUR",
        "value": 0.6
    
]

没关系。

当我打电话时 https://10.1.33.70/api/v1/base-rates/floating/?currency=**EUR**&tenor=**xxx**

我明白了

HTTP 400 Bad Request
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept


    "tenor": [
        "Enter a number."
    ]

也可以,因为中音是整数。

但是当我打电话给https://10.1.33.70/api/v1/base-rates/floating/?currency=**USD**&tenor=**10**

我明白了

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

[]

因为数据库中只有欧元头寸(不是美元)。

如果我给不在数据库中的“货币”参数一个值,是否有可能得到一个“HTTP 400 错误请求”,或者我可以定义什么值可以给参数,否则一个“ HTTP 400 错误请求”。

谢谢:)

【问题讨论】:

【参考方案1】:

您可以尝试在您的 TestSerializer 中添加您想要允许的条件的验证方法。

https://www.django-rest-framework.org/api-guide/serializers/#object-level-validation

【讨论】:

谢谢,我尝试添加 def validate_currency(self, currency): if currency != 'PLN': raise serializers.ValidationError('Wrong parameter!') 但它不起作用 如果您使用序列化程序来验证查询参数,请确保使用 request.query_params 将数据传递给序列化程序,而不是 request.data。代码:serializer = self.get_serializer(data=request.query_params)

以上是关于django-filter 在参数错误时返回空查询集的主要内容,如果未能解决你的问题,请参考以下文章

在标题中使用报表参数

如何保持电源查询的空返回值?

当参数为空列表时,如何避免值限制错误?

MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案

MySQL 左连接时,查询条件查询某个字段为空或者为特定值解决方案

Django-filter 在传递 filter_field 的特定值时获取所有记录