【问题标题】:django object has no attribute 'count'django 对象没有属性'count'
【发布时间】:2015-12-14 21:38:37
【问题描述】:

我正在学习 django/python,但遇到了一个问题。

我有一个视图:create_document.py,我想在其中计算模型类中名称详细信息的数量:NameDetails

我无法获得正确的语法!

这是我的models.py 代码:

class NameDetails(FillableModelWithLanguageVersion):
    user = models.ForeignKey(User)
    name_details_prefix_title = models.CharField(null=True, blank=True, max_length=25)
    name_details_first_name = models.CharField(null=False, blank=False, max_length=50)
    name_details_middle_name = models.CharField(null=True, blank=True, max_length=100)
    ....

这是我的create_document.py 代码,其中我有一个 django 向导。我想确保用户在创建文档之前拥有多个名称:

from app_name.core.models import NameDetails

class CreateDocumentWizard(SessionWizardView):
    template_name = 'documents/document_create.html'

    form_list = [
        core_forms.CreateDocumentWizardForm01,
        core_forms.CreateDocumentWizardForm02,
        core_forms.CreateDocumentWizardForm03,
        core_forms.CreateDocumentWizardForm04,
    ]

    def get_form_kwargs(self, step=None):
        kwargs = super(CreateDocumentWizard, self).get_form_kwargs(step)
        kwargs.setdefault('user', self.request.user)
        return kwargs

    def get_context_data(self, form, **kwargs):

        name_details_count = NameDetails(user=self.request.user).count()
        if name_details_count < 1:
            return redirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)

当我使用该行来确定用户的 NameDetails 计数时:name_details_count = NameDetails(user=self.request.user).count(),我收到以下错误:

NameDetails'对象没有属性'count'

我尝试了很多排列,但我被卡住了。

【问题讨论】:

    标签: python django django-views django-formwizard


    【解决方案1】:

    在你的 get_context_data 函数中应该是这样的:

    name_details_count = NameDetails.objects.filter(user=self.request.user).count()
    

    【讨论】:

    • vaan3713,谢谢,我认为您的代码有效(未返回错误),但重定向似乎无效 - 代码继续执行向导!
    • 您是否尝试调试过 count 的结果?还要检查 settings.MENU_DETAIL_LINK_NAME_DETAILS 是否包含正确的 url
    • 您不能在get_context_data() 中返回重定向,因为SessionWizardView 不会将该值作为响应返回。
    • van3713,谢谢,根本问题正在解决 - 只需解决重定向问题。
    【解决方案2】:

    目前,您正在创建一个全新的NameDetails 实例,并以request.user 作为用户。相反,您应该在数据库中查询当前用户的现有NameDetails,并对它们进行计数。可以通过NameDetails.objects查询数据库:

    name_details_count = NameDetails.objects.filter(user=self.request.user).count()
    

    【讨论】:

    • knbk,谢谢 - 使用您的代码:name_details_count = NameDetails.objects.filter(user=request.user).count() 给了我错误:全局名称“请求”未定义。有什么建议吗?
    • 它需要 self 因为 request 不是传递给函数的参数
    【解决方案3】:

    每次你需要创建一个 Django QuerySet 时,你必须通过对象管理器 objects 所以:NameDetails.objects. 为了进行计数,你需要一个列表,所以你使用 filter:

    name_details_count = NameDetails.objects.filter(user=self.request.user).count()
    

    如果您需要一个元素,请使用get

    name_details_count = NameDetails.objects.get(user=self.request.user)
    

    对于重定向使用更好的HttpResponseRedirect 并确保设置中的链接正确:

    return HttpResponseRedirect(settings.MENU_DETAIL_LINK_NAME_DETAILS)
    

    【讨论】:

      【解决方案4】:

      这是一道 Python 题,或者更一般地说,是一道编程题。

      您的线路:

      name_details_count = NameDetails(user=self.request.user).count()
      

      正在调用NameDetails 类的构造函数,并尝试调用其上不存在的函数count(因此是错误类型)。

      要获得该用户的所有NameDetails 实例的列表,您可以使用:

      name_details = NameDetails.objects.filter(user=self.request.user)
      

      要获取此列表中的项目数,您可以简单地使用 python 内置的len() 函数,如下所示:

      name_details_count = len(NameDetails.objects.filter(user=self.request.user))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-13
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 2015-02-19
        • 2016-03-30
        • 2021-04-05
        • 2013-05-23
        相关资源
        最近更新 更多