首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么queryset返回值而不是Django视图中的实例?

为什么queryset返回值而不是Django视图中的实例?
EN

Stack Overflow用户
提问于 2022-09-01 14:16:27
回答 2查看 33关注 0票数 0

我的问题

我在Django视图有个查询集。该查询集应该返回一个实例。但是它不会返回一个值。

Models.py

代码语言:javascript
运行
复制
class Author(models.Model):
    name = models.CharField(max_length=250, unique=True)
    
    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('authors:author_detail', args=[str(self.id)])


    class Meta:
        verbose_name = 'Author'
        verbose_name_plural = 'Authors'

项目URLS.py

代码语言:javascript
运行
复制
urlpatterns = [
    path('admin/', admin.site.urls),
    path('author/', include('authors_app.urls', namespace='authors')),
]

authors_app ULRS.py

代码语言:javascript
运行
复制
from .views import *

app_name = 'authors'

urlpatterns = [
    path('<int:pk>/', AuthorDetail.as_view(), name='author_detail'),
]

Views.py

代码语言:javascript
运行
复制
class AuthorDetail(ListView):
    model = Book
    context_object_name = 'author_books'
    template_name = 'author-detail.html'
    queryset = Book.objects.all().order_by('bookinfo__bestseller')
    paginate_by = 36

    def get_queryset(self, **kwargs):
        author_id = Author.objects.get(pk = self.kwargs['pk'])
        print(author_id)
        qs = super().get_queryset(**kwargs)
        return qs.filter(author = author_id)


    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super().get_context_data(**kwargs)
        # Add in a QuerySet 
        context['author'] = Author.objects.get(pk = self.kwargs['pk'])
        # context['image'] = f"/mnt/HDD/wiki/parser/images/photos/10.png"
        return context

溯源

代码语言:javascript
运行
复制
Traceback (most recent call last):
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/views/generic/list.py", line 142, in get
    self.object_list = self.get_queryset()
  File "/mnt/HDD/tibrains/08/titest_project/authors_app/views.py", line 17, in get_queryset
    return qs.filter(author = author_id)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/query.py", line 941, in filter
    return self._filter_or_exclude(False, args, kwargs)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/query.py", line 961, in _filter_or_exclude
    clone._filter_or_exclude_inplace(negate, args, kwargs)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/query.py", line 968, in _filter_or_exclude_inplace
    self._query.add_q(Q(*args, **kwargs))
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1393, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1412, in _add_q
    child_clause, needed_inner = self.build_filter(
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1320, in build_filter
    self.check_related_objects(join_info.final_field, value, join_info.opts)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1147, in check_related_objects
    self.check_query_object_type(value, opts, field)
  File "/mnt/HDD/tibrains.test/titest-env/lib/python3.8/site-packages/django/db/models/sql/query.py", line 1128, in check_query_object_type
    raise ValueError(
ValueError: Cannot query "Lawrence Gilman": Must be "Author" instance.

当我打开作者页面- mysite.com/author/51/时,我发现了一个错误:无法查询"Lawrence“:必须是"Author”实例。

问题

我如何在查询集中获得一个实例?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-01 19:31:36

您可以使用author_id本身进行筛选,从而获得具有以下内容的get_queryset

代码语言:javascript
运行
复制
from django.shortcuts import get_object_or_404


class AuthorDetailView(ListView):
    # …

    def get_queryset(self, **kwargs):
        return super().get_queryset(**kwargs).filter(author_id=self.kwargs['pk'])

    def get_context_data(self, **kwargs):
        return super().get_context_data(
            **kwargs, author=get_object_or_404(Author, pk=self.kwargs['pk'])
        )
票数 1
EN

Stack Overflow用户

发布于 2022-09-01 14:51:38

我想这就是问题所在:

代码语言:javascript
运行
复制
author_id = Author.objects.get(pk = self.kwargs['pk'])

使用filter而不是get

代码语言:javascript
运行
复制
author_id = Author.objects.filter(pk = self.kwargs['pk'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73570884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档