簡體   English   中英

Python、Django、Mongodb:查看找不到文檔

[英]Python, Django, Mongodb: view can't find document

我覺得我缺少一些簡單的東西。 在一個小型個人項目上,我有一個 MongoDB,我通過 Djongo 連接到它。 我已經開始制作前端,但使用通用 MongoDB Object ID 的集合有問題。 該視圖將返回 404,而在 MongoDB 內使用相同的查詢返回所需的文檔。 其他頁面都很好,這是唯一使用 ObjectIDField 的頁面,因為它是倉促的后期添加

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'),
]

管理員按預期使用鏈接中的相同 631b1ce580404ce3f61d4565 工作,例如:

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

將查詢打印到控制台:{'_id': ObjectId('631b1ce580404ce3f61d4565')} 這看起來是正確的,所以我不確定哪里出了問題。 任何幫助將不勝感激,謝謝!

包含 slug 的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"]) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM