#10634: Confusing differential exceptions: get_or_create vs get with psycopg2 ---------------------------------------------------+------------------------ Reporter: fergusferrier | Owner: nobody Status: new | Milestone: Component: Database layer (models, ORM) | Version: SVN Keywords: psycopg2 get_or_create get misleading | Stage: Unreviewed Has_patch: 0 | ---------------------------------------------------+------------------------ I'm using Psycopg2. I hope the models here are somewhat self-explanatory in structure.
I made the simple mistake of forgetting the boolean 'created' in a get_or_create... {{{ usr = EventsUser.objects.get_or_create(user = request.user) }}} Then running the following code [NB. usr is not an instance of EventsUser at this point]... {{{ Reminder.objects.get_or_create( events_user = usr, event = event, assoctype = 'EML_HR' ) }}} gives thus: {{{ Traceback (most recent call last): File "/home/django/domains/staging.mypidge.com/project/Apps/Events/tests/views.py", line 418, in test_set_reminder_unset response = self.client.get(reverse('Events.views.SetReminders', args=[self.event.id]), {'day': '1', 'hour': '1'}) File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/test/client.py", line 278, in get response = self.request(**r) File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/core/handlers/base.py", line 91, in get_response response = callback(request, *callback_args, **callback_kwargs) File "/home/django/domains/staging.mypidge.com/project/Apps/basic/funcs.py", line 35, in decorator return f(request, *args, **kwargs) File "/home/django/domains/staging.mypidge.com/project/Apps/Events/views.py", line 319, in SetReminders assoctype = 'EML_HR' File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/manager.py", line 120, in get_or_create return self.get_query_set().get_or_create(**kwargs) File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/query.py", line 365, in get_or_create return self.get(**kwargs), False File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/query.py", line 337, in get num = len(clone) File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/query.py", line 161, in __len__ self._result_cache = list(self.iterator()) File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/query.py", line 281, in iterator for row in self.query.results_iter(): File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/sql/query.py", line 256, in results_iter for rows in self.execute_sql(MULTI): File "/home/django/domains/mypidge.com/env/lib/python2.5/site- packages/django/db/models/sql/query.py", line 2098, in execute_sql cursor.execute(sql, params) File "build/bdist.linux-x86_64/egg/psycopg2/extensions.py", line 96, in getquoted pobjs = [adapt(o) for o in self._seq] ProgrammingError: can't adapt }}} When one replaces the second get_or_create with a plain get, you are returned {{{ ValueError: Cannot assign "(<EventsUser: EventsUser object>, False)": "Reminder.events_user" must be a "EventsUser" instance. }}} which is a much more useful exception. I would expect get_or_create to return a similar. -- Ticket URL: <http://code.djangoproject.com/ticket/10634> Django <http://code.djangoproject.com/> The Web framework for perfectionists with deadlines. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-updates@googlegroups.com To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/django-updates?hl=en -~----------~----~----~----~------~----~------~--~---