首页 > 解决方案 > Djongo (mongoDb) - Django 休息框架在 JsonFields 上的搜索问题

问题描述

我在 MongoDB 上的 Django REST API 中过滤 JsonFIleds 时遇到问题。我使用 djongo 连接 MongoDB。

每次我收到此错误时:

raise FieldError(
    django.core.exceptions.FieldError: 
        Unsupported lookup 'seq' for JSONField or join on the field not permitted.
[11/May/2021 10:21:00] "GET /rest/broker/topic/?decode_message_seq=34 HTTP/1.1" 500 21577

我想在数据库中保存的 json 中搜索信息。在下面的代码中,它尝试搜索 decode_message 字段包含 seq 字段的数据。我搜索了论坛和文档,但找不到我的错误的答案。

模型:

from django.db import models
from djongo.models import JSONField, DjongoManager


class Topic(models.Model):
    topic = models.TextField(max_length=250)
    message = JSONField()
    decode_message = JSONField(blank=True, null=True)
    create_at = models.DateTimeField(auto_now_add=True, null=True)
    objects = DjongoManager()

序列化器:

from .models import Topic
from .utilis import decodeMqttMessage
from rest_framework import serializers

class TopicSerializer(serializers.HyperlinkedModelSerializer):
    message = serializers.JSONField()
    decode_message = serializers.JSONField()

class Meta:
    model = Topic
    fields = ['id', 'topic', 'message', 'decode_message', 'create_at']


    def create(self, dict, *args, **kwargs):
        topic = dict.get('topic', None)
        message = dict.get('message', None)
        decode_message = decodeMqttMessage(message)

        new_broker_info = Topic.objects.create(topic=topic, message=message, decode_message=decode_message)
        new_broker_info.save()

        return new_broker_info

过滤器:

import django_filters
from .models import Topic

class TopicFilter(django_filters.rest_framework.FilterSet):
    decode_message_seq = django_filters.CharFilter(field_name="decode_message__seq", lookup_expr='icontains')

    class Meta:
        model = Topic
        fields = ["id", "topic", "decode_message_seq", "create_at"]

数据库中保存的记录:

{ 
"_id" : ObjectId("60890486a92950cd4f4b9098"), 
"id" : NumberInt(1), 
"topic" : "spBv1.0/9991/DDATA/9991/P7_HMI2", 
"message" : {
    "metrics" : [
        {
            "dataType" : "UInt16", 
            "name" : "CPUusage", 
            "timestamp" : NumberLong(1618999291304), 
            "value" : NumberInt(74)
        }
    ], 
    "seq" : NumberInt(135), 
    "timestamp" : NumberLong(1618999291304)
}, 
"decode_message" : {
        "seq" : NumberInt(135), 
        "timestamp" : NumberLong(1618999291304), 
        "CPUusage" : NumberInt(74)
    }, 
    "create_at" : ISODate("2021-04-28T06:45:26.854+0000")
}

标签: pythondjangomongodbdjango-rest-frameworkdjango-filter

解决方案


推荐阅读