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 左连接时,查询条件查询某个字段为空或者为特定值解决方案