django - 使用 django rest 框架使用过滤器查询数据
问题描述
所以我在 django 之上使用 django rest 框架作为我的服务器端,使用 MongoDB 作为数据库(具体来说,是一个 mongo 副本集)。
我的模型如下所示:
#models.py
class MyModel(models.Model):
data = models.TextField()
这是我正在使用的序列化程序:
#serializers.py
class MySerializer(serializers.ModelSerializer):
data = serializers.JSONField(binary=True)
def create(self, validated_data):
test = MyModel(data=validated_data)
test.save()
return test
class Meta:
model = MyModel
fields = ['data']
这是我的看法:
#views.py
class MyView(APIView):
serializer_class = MySerializer
def post(self, request):
serializer = self.serializer_class(data=request.data)
try:
serializer.is_valid(raise_exception=True)
serializer.save()
except djongo.sql2mongo.SQLDecodeError:
return Response(
status=status.HTTP_503_SERVICE_UNAVAILABLE
)
return Response(
status=status.HTTP_200_OK
)
然后,在测试模式下,我使用 httpie 将一些记录写入数据库。请求如下所示:
http POST localhost:8000/api/test data='{"sizes": ["M", "L"], "colors": ["white", "yellow"], "model": "poet"}'
http POST localhost:8000/api/test data='{"colors": ["red", "black"], "sizes": ["S", "M"], "model": "polo", "material": "silk"}'
http POST localhost:8000/api/test data='{"colors": ["white", "yellow"], "sizes": ["M", "L", "XL"], "model": "poet", "material": "bamboo"}'
数据被写入数据库并被复制。所以现在我想进行以下查询:
test = MyModel.objects.filter(data__contains={'sizes': ['M', 'L']})
但它返回一个空的查询集,它不应该这样做。
我究竟做错了什么?
解决方案
根据这里的 Django 文档:
我认为这就是您正在寻找的(未经测试)
模型
class MyModel(models.Model):
data = models.JSONField() # New in Django 1.11.
询问
# data='{"sizes": ["M", "L"], "colors": ["white", "yellow"], "model": "poet"}'
MyModel.objects.filter(data__sizes__contains=['M', 'L'])
MyModel.objects.filter(data__model='poet')
推荐阅读
- c# - 如果在关闭时使用,是否保证方法的其余部分将在 WhenAll 之后执行?
- http-authentication - 如何使用 CLI 参数为 Traefik 仪表板设置密码?
- excel - 在以某种方式对其进行操作后,如何计算字符串值满足特定条件的范围内的单元格?
- arduino - Arduino MKRFOX1200 COM 端口不工作
- objective-c - 如何获取我的块的返回值
- sql-server - 通过 SQL Server 代理运行的 SSIS 包无法修改变量
- amazon-web-services - 将 SNS 主题订阅从一个设备端点复制到另一个
- php - 在邮件 PHP 中添加 QR 图像
- sql-server - how to optimize nested loop query
- c# - 命名空间 xamarin 中不存在资源