Opened 6 years ago

Closed 6 years ago

Last modified 3 years ago

#11194 closed (fixed)

Saving proxy model with raw=True gives UnboundLocalError 'record_exists'

Reported by: wardi Owned by: nobody
Component: Database layer (models, ORM) Version: 1.1-beta
Severity: Keywords: proxy model serialization
Cc: Triage Stage: Unreviewed
Has patch: yes Needs documentation: no
Needs tests: yes Patch needs improvement: yes
Easy pickings: UI/UX:

Description

When importing data I am running into this error:

Problem installing fixture '../tpm/contacts/fixtures/sampladata.json': Traceback (most recent call last):
  File "/usr/local/lib/python2.5/site-packages/django/core/management/commands/loaddata.py", line 153, in handle
    obj.save()
  File "/usr/local/lib/python2.5/site-packages/django/core/serializers/base.py", line 163, in save
    models.Model.save_base(self.object, raw=True)
  File "/usr/local/lib/python2.5/site-packages/django/db/models/base.py", line 495, in save_base
    created=(not record_exists), raw=raw)
UnboundLocalError: local variable 'record_exists' referenced before assignment

Attachments (1)

db.models.base.patch (362 bytes) - added by wardi 6 years ago.
patch to define record_exists in all cases

Download all attachments as: .zip

Change History (7)

Changed 6 years ago by wardi

patch to define record_exists in all cases

comment:1 Changed 6 years ago by kmtracey

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

It would help if you would provide sample data to recreate the error. If all fixture loading was broken, the test suite would be having serious problems, and it is not. So what is special about you data that is triggering this problem?

comment:2 Changed 6 years ago by dc

I can reproduce this error with this model:

from django.contrib.auth.models import User
class UserProxy(User):
    class Meta:
        proxy = True

and with any fixture, for e.g.

{
	"model": "myapp.userproxy",
	"pk": 1,
	"fields": {
		"username": "username"
	}
}

It also can be repoduced without fixtures:

>>> from myapp.models import UserProxy
>>> UserProxy(username='username').save_base(raw=True)
Traceback (most recent call last):
...
UnboundLocalError: local variable 'record_exists' referenced before assignment

comment:3 Changed 6 years ago by kmtracey

  • milestone set to 1.1
  • Needs tests set
  • Patch needs improvement set

OK, so the problem is a combination of using raw=True (as fixture loading (always?) does) and proxy models. It looks to me like the save_base routine is coded to never expect to be called with both raw=True and meta.proxy=True. The attached patch fixes the visible error (avoids an exception) but the resulting behavior of the function does not appear to be correct. It sends a pre-save signal, then skips out on the saving of parent class(es) because raw is True, then skips out on the remainder of the try an update, try an insert logic because meta.proxy is True. The only thing left not under the if not meta.proxy is the sending of the post save signal. So that patch makes it possible to call the routine, and the pre and post save signals will be sent, but nothing will be saved. There seems to be a deeper problem than a local variable used before being set here.

Setting 1.1 milestone because someone with a clue about proxy models and serialization should probably look at this before 1.1.

comment:4 Changed 6 years ago by dc

  • Component changed from Uncategorized to Database layer (models, ORM)
  • Keywords proxy model serialization added; record_exists db import removed
  • Summary changed from django.db.models.base.py: UnboundLocalError: local variable 'record_exists' referenced before assignment to Saving proxy model with raw=True gives UnboundLocalError 'record_exists'

comment:5 Changed 6 years ago by russellm

  • Resolution set to fixed
  • Status changed from new to closed

(In [10955]) Fixed #11194 -- Corrected loading of Proxy models from fixtures (and, by extension, save_base(raw=True) for Proxy models).

comment:6 Changed 3 years ago by jacob

  • milestone 1.1 deleted

Milestone 1.1 deleted

Note: See TracTickets for help on using tickets.
Back to Top