首页 > 解决方案 > 使用 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']})

但它返回一个空的查询集,它不应该这样做。

我究竟做错了什么?

标签: djangodjango-rest-framework

解决方案


根据这里的 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')

推荐阅读