【问题标题】:Django QuerySet get_or_create - TypeError - save() got an unexpected keyword argument 'using'Django QuerySet get_or_create - TypeError - save() 得到了一个意外的关键字参数“使用”
【发布时间】:2013-02-01 11:14:25
【问题描述】:

我在查询集上使用 get_or_create 时出错:

TypeError at ... save() 得到了一个意外的关键字参数“使用”

这是我的看法:

class MailingListSubscriptionForm(forms.ModelForm):
    """Form for subscribing to a mailing list"""
    # Notes : This form will not check the uniquess of
    # the 'email' field, by defining it explictly and setting
    # it the Meta.exclude list, for allowing registration
    # to a mailing list even if the contact already exists.
    # Then the contact is always added to the subscribers field
    # of the mailing list because it will be cleaned with no
    # double.

    email = forms.EmailField(label=_('Email'), max_length=75)

    def save(self, mailing_list):
        data = self.cleaned_data
        contact, created = Subscriber.objects.get_or_create(
            email__exact=data['email'], defaults={'email': data['email']}
        )

        mailing_list.subscribers.add(contact)
        mailing_list.unsubscribers.remove(contact)

    class Meta:
        model = Subscriber
        fields = ('email',)

这是完整的追溯:

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/home/newsletter/

Django Version: 1.4.3
Python Version: 2.7.3
Installed Applications:
('jmb.core',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'south',
 'easy_thumbnails',

 'web',
 'sccore.profiles',
 'django.contrib.admin',
 'django_extensions',

 'cms',
 'mptt',
 'menus',
 'south',
 'sekizai',
 'cms.plugins.flash',
 'cms.plugins.googlemap',
 'cms.plugins.link',
 'cms.plugins.snippet',
 'cms.plugins.text',
 'cms.plugins.twitter',
 'filer',
 'cmsplugin_filer_file',
 'cmsplugin_filer_folder',
 'cmsplugin_filer_image',
 'cmsplugin_filer_teaser',
 'cmsplugin_filer_video',
 'easy_thumbnails',
 'tinymce',

 'debug_toolbar',
 'django_extensions')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'jmb.core.middleware.thread_local.ThreadLocals',
 'cms.middleware.multilingual.MultilingualURLMiddleware',
 'cms.middleware.page.CurrentPageMiddleware',
 'cms.middleware.user.CurrentUserMiddleware',
 'cms.middleware.toolbar.ToolbarMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware')


Template error:
In template /home/luca/src/jmb-siti/www.acomea.it/web/templates/bootstrap_full.html, error at line 12
   save() got an unexpected keyword argument 'using'
   2 : {% load cms_tags menu_tags sekizai_tags %}


   3 : 


   4 : {% block central_content_left %}{% endblock %}


   5 : {% block central_content %}


   6 : <div class="span9 central_content">


   7 :     <div class="row-fluid">


   8 :         {% block central_content_central %}


   9 :         {% block central_content_central_top %}{% endblock %}


   10 :         {% block central_content_central_middle %}


   11 :         <div class="span12 central_content_central_middle"><div class="item6 height5">


   12 :              {% placeholder central_content_central_middle %} 


   13 :         </div></div>


   14 :         {% endblock %}


   15 :         {% block central_content_central_bottom %}{% endblock %}


   16 :         {% endblock %}


   17 :     </div>


   18 : </div>


   19 : {% endblock %}


   20 : {% block central_content_right %}{% endblock %}


   21 : 


   22 : {% block central_right %}{% endblock %}


Traceback:
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/views.py" in details
  113.     return render_to_response(template_name, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/shortcuts/__init__.py" in render_to_response
  20.     return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader.py" in render_to_string
  171.         return t.render(Context(dictionary))
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  140.             return self._render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  123.         return compiled_parent._render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/test/utils.py" in instrumented_test_render
  62.     return self.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/django_classy_tags-0.3.4.1-py2.7.egg/classytags/core.py" in render
  102.         return self.render_tag(context, **kwargs)
File "/home/luca/.buildout/eggs/django_sekizai-0.6.1-py2.7.egg/sekizai/templatetags/sekizai_tags.py" in render_tag
  75.         rendered_contents = nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/loader_tags.py" in render
  62.             result = block.nodelist.render(context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/base.py" in render
  823.                 bit = self.render_node(node, context)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/template/debug.py" in render_node
  74.             return node.render(context)
File "/home/luca/.buildout/eggs/django_classy_tags-0.3.4.1-py2.7.egg/classytags/core.py" in render
  102.         return self.render_tag(context, **kwargs)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/templatetags/cms_tags.py" in render_tag
  235.         content = get_placeholder_content(context, request, page, name, inherit)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/templatetags/cms_tags.py" in get_placeholder_content
  154.         content = render_placeholder(placeholder, context, name)
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/plugin_rendering.py" in render_placeholder
  126.     content.extend(render_plugins(plugins, context, placeholder, processors))
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/plugin_rendering.py" in render_plugins
  80.         out.append(plugin.render_plugin(context, placeholder, processors=processors))
File "/home/luca/.buildout/eggs/django_cms-2.3.3-py2.7.egg/cms/models/pluginmodel.py" in render_plugin
  171.             context = plugin.render(context, instance, placeholder_slot)
File "/home/luca/src/jumbo2/jmb.newsletter/jmb/newsletter/cms/plugins.py" in render
  27.                 form.save(instance.mailing_list)
File "/home/luca/src/jumbo2/jmb.newsletter/jmb/newsletter/forms.py" in save
  27.             email__exact=data['email'], defaults={'email': data['email']}
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/db/models/manager.py" in get_or_create
  134.         return self.get_query_set().get_or_create(**kwargs)
File "/home/luca/.buildout/eggs/Django-1.4.3-py2.7.egg/django/db/models/query.py" in get_or_create
  452.                 obj.save(force_insert=True, using=self.db)

Exception Type: TypeError at /home/newsletter/
Exception Value: save() got an unexpected keyword argument 'using'

【问题讨论】:

    标签: django django-models django-queryset


    【解决方案1】:

    您已经覆盖了Subscriber 模型中save 的定义,您没有显示该定义,并且不允许完整的参数列表。您应该始终在重写的方法中支持*args, **kwargs,并将它们传递给super() 调用。

    虽然这不是这个问题的原因,但你的表单保存方法也是如此,它不支持像commit 这样的参数。再次接受*args, **kwargs。并且一定要在这里调用super 方法,你目前没有这样做。

    【讨论】:

      【解决方案2】:

      像这样更改save 可能会解决问题

      def save(self, mailing_list, *args, **kwargs):
          data = self.cleaned_data
          contact, created = Subscriber.objects.get_or_create(
              email__exact=data['email'], defaults={'email': data['email']}
          )
      
          mailing_list.subscribers.add(contact)
          mailing_list.unsubscribers.remove(contact)
      
          super(MailingListSubscriptionForm, self).save(*args, **kwargs)
      

      正如Daniel 所说,看起来您已经完成了类似于Subscriber 模型(您尚未发布)的操作。如果您还没有的话,我建议您在那里添加类似的super()super 调用只会在自定义保存代码完成后(或在函数开始之前)调用父 save()

      【讨论】:

        猜你喜欢
        • 2019-02-20
        • 1970-01-01
        • 2021-12-07
        • 2020-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2020-06-15
        相关资源
        最近更新 更多