【问题标题】:django URLs MultipleObjectsReturned errordjango URLs MultipleObjectsReturned 错误
【发布时间】:2020-06-30 07:00:39
【问题描述】:

我正在用 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 可以确保它是唯一的,即使两个博客被称为完全相同的东西。

Views.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 的情况下解决这个问题? 如果有人能解释为什么我的逻辑是错误的,而且它一开始就不起作用。

谢谢。

【问题讨论】:

  • 显示您如何过滤的代码
  • @shafik,我已经编辑了问题以包含视图,py

标签: python django


【解决方案1】:

您需要确保获得该用户的同名博客。我不知道你的博客模型到底是什么样子,但它会是这样的

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

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

【讨论】:

  • 很好的答案,非常感谢!很好地解决了这个问题(和未来的问题)。干杯
【解决方案2】:

您需要使name 字段唯一,如果您想使用clean url,请使用SlugField

class Restaurant(models.Model):
    name = models.CharField(unique=True, ...)
    slug = models.SlugField(unique=True, ...)
    ...

【讨论】:

  • 函数命名请使用snake_case,使用django.shortcuts.get_object_or_404。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2018-08-17
  • 2017-11-05
相关资源
最近更新 更多