You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中MongoDB嵌入式与数组字段查询问题求助

解决Django+Djongo中嵌入式字段与数组字段的查询问题

我来帮你搞定这个查询报错的问题,先梳理下你的代码问题和对应的解决方案:

1. 先修正get()和filter()的误用

你现在用了Igrica.objects.get(...),但get()是用来获取单个唯一对象的,当有多个符合条件的游戏时会直接抛出MultipleObjectsReturned异常,而且后续你用了many=True序列化多个对象,这肯定会出错。你需要换成filter()来获取符合条件的查询集:

@api_view(['GET'])
def najjeftinije_prvo(request):
    # 用filter替代get,获取所有pegi_rejting=18的游戏
    igrice = Igrica.objects.filter(detalji_igrica__pegi_rejting=18)
    igrica_serializer = IgricaSerializer(igrice, many=True)
    return JsonResponse(igrica_serializer.data, safe=False)

2. 嵌入式字段(EmbeddedField)的查询方案

如果上面的双下划线查询还是报Unsupported lookup错误,那可以试试Djongo支持的字典匹配语法,直接传入嵌入式字段的键值对:

igrice = Igrica.objects.filter(detalji_igrica={'pegi_rejting': 18})

这种方式直接对应MongoDB的原生查询语法,兼容性更好,适合旧版本的Djongo。

3. 数组字段(ArrayField)的查询方案

对于komentari数组字段的查询,比如要找评论中存在id_korisnika=xxx的游戏,有两种常用方式:

方式1:简单匹配数组元素字段

直接用双下划线查询数组中的元素字段,会匹配数组中任意一个元素满足条件的记录:

# 查询评论中存在id_korisnika=1的游戏
igrice = Igrica.objects.filter(komentari__id_korisnika=1)

方式2:多条件匹配同一个数组元素(elemMatch)

如果需要同时匹配数组元素的多个字段(比如id_korisnika=1且rejting_korisnika>=4.0),可以用Q对象结合elemMatch语法:

from django.db.models import Q

igrice = Igrica.objects.filter(
    Q(komentari__elemMatch={'id_korisnika': 1, 'rejting_korisnika': 4.5})
)

额外注意事项

  • 建议升级Djongo到最新版本:旧版本对嵌入式和数组字段的查询支持有缺陷,执行pip install --upgrade djongo可以避免很多兼容性问题。
  • 你的抽象模型定义是正确的:给detalji_igrica和komentari设置abstract = True是Djongo定义嵌入式模型的标准方式,没问题。

内容的提问来源于stack exchange,提问作者mr.m.m.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:59:38