首页 > 解决方案 > django URLs MultipleObjectsReturned 错误

问题描述

我正在用 Django 制作一个简单的 webapp。用户可以拥有个人资料,并在该个人资料下创建博客文章。

例如:

"path('profile/<int:pk>/',profile, name='profile')" 

返回网址

"http://127.0.0.1:8000/profile/1/"

然后,用户可以编写在 URL 中具有名称的博客文章

例子:

path('profile/<int:pk>/blog/<str:name>',Blogs, name='Blogs'),

返回网址

"http://127.0.0.1:8000/profile/1/blog/HelloWOrld"

但是,如果两个不同的用户都将他们的博客命名为相同的确切名称,我会收到“MultipleObjectsReturned”错误。

我认为通过在 URL 中更早地让用户 PK 可以确保它是唯一的,即使两个博客被称为完全相同的东西。

视图.py

def Blog(request, pk, name):
    blog = Restaurant.objects.get(name=name)
    user = CustomUser.objects.get(pk=pk)
    if not user.id == request.user.pk:
        raise PermissionDenied()
    else:
        context = {
            'user': user,
            'blog': blog,
        }
        return render(request, 'blog/blogs.html',context)

有没有办法在不使用博客的 PK 的情况下解决这个问题?如果有人能解释为什么我的逻辑是错误的,而且它一开始就不起作用。

谢谢。

标签: pythondjango

解决方案


您需要确保获得该用户的该名称的博客。我不知道你的博客模型看起来如何,但它会是这样的

user = CustomUser.objects.get(pk=pk)
blog = Restaurant.objects.get(name=name, user=user)

并且在模型上,使用 'unique_together' 属性来确保用户和博客名称的组合是唯一的,否则这些 URL 将不起作用。没有必要像 George 的回答那样拥有完全唯一的名称,这意味着用户无法创建具有其他用户已经制作的标题的博客文章。


推荐阅读