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.
相关产品推荐
相关产品推荐

