Django+Djongo连接MongoDB,视图无法找到ObjectID对应文档
问题排查与解决方案
1. 模型代码缩进错误(核心问题)
你的Railway_Firmware模型中,class Meta、get_absolute_url和__str__方法未缩进在类内部,导致模型配置失效、方法无法被正确调用,这是触发404的关键原因之一。修正后的模型代码如下:
from django.db import models from bson.objectid import ObjectId from django.urls import reverse class Railway_Firmware(models.Model): _id = models.ObjectIdField(name='_id', verbose_name='_id', db_column='_id', editable=False, primary_key=True) qa = models.CharField(name='QA', verbose_name='QA', db_column='QA', max_length=200) security = models.CharField(name='Security', verbose_name='Security', db_column='Security', max_length=200) objects = models.Manager() class Meta: db_table = "Firmware" verbose_name_plural = "firmware" def get_absolute_url(self): return reverse('firmware-detail-view', args=[self._id]) def __str__(self): return str(self._id)
2. 优化视图查询逻辑
DetailView默认会通过pk_url_kwarg指定的字段查询主键,你重写get_queryset的方式存在冗余,建议直接重写get_object方法确保查询逻辑精准:
from django.views.generic import DetailView from bson.objectid import ObjectId from .models import Railway_Firmware class Railway_Firmware_DetailView(DetailView): model = Railway_Firmware context_object_name = 'firmware' template_name = 'firmware/firmware_detail.html' pk_url_kwarg = '_id' def get_object(self, queryset=None): return Railway_Firmware.objects.get(_id=ObjectId(self.kwargs['_id']))
3. 调整URL路径参数类型
虽然slug可以匹配ObjectID的十六进制字符,但使用str类型更通用,避免潜在的匹配限制:
from django.urls import path from . import views urlpatterns = [ path('firmware/<str:_id>/', views.Railway_Firmware_DetailView.as_view(), name='firmware-detail-view'), ]
验证步骤
- 修正模型缩进后重启Django服务
- 访问详情页,检查是否能正常加载目标文档
- 若仍有问题,可在
get_object中打印查询的ObjectID与集合中的文档ID,确认格式完全一致(注意排除空格、大小写差异)
内容的提问来源于stack exchange,提问作者dp_bluesets
相关产品推荐
相关产品推荐

