Django .get() 返回一个元组而不是对象

Posted

技术标签:

【中文标题】Django .get() 返回一个元组而不是对象【英文标题】:Django .get() returns a tuple and not the object 【发布时间】:2018-02-22 19:34:24 【问题描述】:

我有一个简单的函数,如下所示:

parent_key = SeoKeys.objects.get(view_id=view_id, key_nbr=key_nbr)
    if parent_key.status != 'active':
        parent_key.status = status
        parent_key.save()

    metrics, created = SeoMetrics.objects.get_or_create(
                                                        seo_url = url_sent,
                                                        date = date,
                                                        parent_key = parent_key,
                                                        defaults = 
                                                                'parent_key':parent_key,
                                                                'seo_url': url_sent,
                                                                'url_found':url_found,
                                                                'position':position,
                                                                
                                                        )

现在理论上这应该可以工作,但是我收到以下错误:

ValueError: Cannot assign "(<SeoKeys: SeoKeys object>,)": "SeoMetrics.parent_key" must be a "SeoKeys" instance.

这是因为它是一个元组。如果我这样做 'parent_key':parent_key[0] 它会很好地保存它。然而,这似乎是一个相当黑客的解决方案,我想了解为什么会发生这种情况。有什么想法吗?

我的模型看起来像这样:

class SeoMetrics(models.Model):
    parent_key = models.ForeignKey('SeoKeys', on_delete=models.CASCADE)

编辑: 添加了完整的错误:

Internal Server Error: /hook/
Traceback (most recent call last):
  File "/Users/Costantin/GDrive/Analytic.me/dev/venv/lib/python3.5/site-packages/django/core/handlers/exception.py", line 41, in inner
    response = get_response(request)
  File "/Users/Costantin/GDrive/Analytic.me/dev/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 187, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/Costantin/GDrive/Analytic.me/dev/venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 185, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/Costantin/GDrive/Analytic.me/dev/venv/lib/python3.5/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view
    return view_func(*args, **kwargs)
  File "/Users/Costantin/GDrive/Analytic.me/dev/backend/apps/seo_app/views.py", line 152, in webhook
    metrics.parent_key = parent,
  File "/Users/Costantin/GDrive/Analytic.me/dev/venv/lib/python3.5/site-packages/django/db/models/fields/related_descriptors.py", line 216, in __set__
    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "(<SeoKeys: SeoKeys object>,)": "SeoMetrics.parent_key" must be a "SeoKeys" instance.

【问题讨论】:

请使用回溯发布整个错误消息。此外,您不必在 defaults 中重复 parent_keyseo_url,因为您已经将它们传递为 kwargs @Selcuk 我添加了完整的错误。感谢kwargs 我不知道它们会自动添加,但确实有道理。 【参考方案1】:
 File "/Users/Costantin/GDrive/Analytic.me/dev/backend/apps/seo_app/views.py", line 152, in webhook
   metrics.parent_key = parent,

这段代码正在创建一个元组。删除行尾的逗号。

【讨论】:

是的,这修复了它。谢谢伊格纳西奥 所以只是为下一个发现此问题的人添加更多信息:这发生在我的问题中的编码之后,在if not created 部分。这很令人困惑,因为我没想到那里看。所以请留意那里的额外逗号!再次感谢伊格纳西奥

以上是关于Django .get() 返回一个元组而不是对象的主要内容,如果未能解决你的问题,请参考以下文章

在类型中使用元组而不是联合数组

numpy.genfromtxt 导入元组而不是数组

从Haskell中的元组中提取第n个元素(其中n和元组被赋予参数)

python从对象中获取类名

django 视图没有返回 HttpResponse 对象。它返回 None 而不是

Django 保存到 DB:TypeError:int() 参数必须是字符串、类似字节的对象或数字,而不是“元组”