Python、Django、MongoDB:查看找不到文档

3okqufwl  于 2022-10-04  发布在  Python
关注(0)|答案(1)|浏览(137)

我觉得我错过了一些简单的东西。我正在做一个小的个人项目,我有一个MongoDB,我正在通过Djongo连接到它。我已经开始制作一个前端,但在使用通用MongoDB对象ID的集合时遇到了问题。该视图将返回404,而在MongoDB中使用相同的查询将返回所需的文档。其他页面都很好,这是唯一使用对象ID字段的页面,因为它是一个仓促的后期添加

Model:
class Railway_Firmware(models.Model):
    _id = models.ObjectIdField(name='_id', verbose_name='_id', db_column='_id', editable=False, max_length=200, 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)

View:
class Railway_Firmware_DetailView(generic.DetailView):
    model = Railway_Firmware
    context_object_name = 'firmware'
    template_name = 'firmware/firmware_detail.html'
    pk_url_kwarg = '_id'

    def get_queryset(self):
        print({'_id': ObjectId(self.kwargs['_id'])})
        return Railway_Firmware.objects.filter(**{'_id': ObjectId(self.kwargs['_id'])})

URL:
urlpatterns = [    path('firmware/<slug:_id>/', views.Railway_Firmware_DetailView.as_view(), name='firmware-detail-view'),
]

Admin与链接中相同的631b1ce580404ce3f61d4565的工作方式相同,例如:

/admin/web_dev/railway_firmware/631929cc0b15c01285ae87e1/change/

正在将查询打印到控制台:{‘_id’:ObjectID(‘631b1ce580404ce3f61d4565’)}这看起来是正确的,所以我不确定哪里出了问题。如有任何帮助,我们将不胜感激,谢谢!

k5ifujac

k5ifujac1#

在您的路由中,包含插件的URLConf关键字参数的名称为_id

您已在DetailView中指定了pk_url_kwarg = '_id'。因此,错误的过滤器应用于您的查询集,因为您的文档中没有pk字段。

queryset = queryset.filter(pk=pk)

在通过get_object方法为查询集构建筛选器时,需要通知DetailView使用slug字段。

class Railway_Firmware_DetailView(generic.DetailView):
    model = Railway_Firmware
    context_object_name = 'firmware'
    template_name = 'firmware/firmware_detail.html'
    slug_url_kwarg = '_id'
    slug_field = '_id'

    def setup(self, request, *args,**kwargs):
        super().setup(request, *args,**kwargs)
        # Ensure that _id value is an ObjectId type for query filters to work
        self.kwargs["_id"] = ObjectId(self.kwargs["_id"])

相关问题