#28972: `RelatedObjectDoesNotExist` during `loaddata` of models with multi-table
inheritance
------------------------------------------------+------------------------
               Reporter:  Kal Sze               |          Owner:  nobody
                   Type:  Bug                   |         Status:  new
              Component:  Core (Serialization)  |        Version:  2.0
               Severity:  Normal                |       Keywords:
           Triage Stage:  Unreviewed            |      Has patch:  0
    Needs documentation:  0                     |    Needs tests:  0
Patch needs improvement:  0                     |  Easy pickings:  0
                  UI/UX:  0                     |
------------------------------------------------+------------------------
 Software versions
 * Python 3.6.3
 * Django 2.0
 * django-model-utils 3.1.1 (from git)
 * PostgreSQL 9.4
 * psycopg2 2.7.3.2

 I have a `licenses` app, with these models:
 * `BaseLicense`, a concrete model, with a `ForeignKey` to
 `settings.AUTH_USER_MODEL`.
 * `CorelDrawLicense`, which inherits from `BaseLicense` through multi-
 table inheritance
 * `AdobePhotoshopLicense`, which inherits from `BaseLicense` through
 multi-table inheritance

 I created an instance of `AdobePhotoshopLicense`, then tried to do
 `manage.py dumpdata` and `manage.py loaddata`.

 `dumpdata` "worked" - there was no error.

 However, `loaddata` failed with this traceback:
 {{{
 Traceback (most recent call last):
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/serializers/json.py", line 69, in Deserializer
     yield from PythonDeserializer(objects, **options)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/serializers/python.py", line 170, in Deserializer
     obj = base.build_instance(Model, data, using)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/serializers/base.py", line 225, in build_instance
     natural_key = obj.natural_key()
   File "/home/kal/git/nk_test/licenses/models.py", line 33, in natural_key
     return (self.user.natural_key(), self.license_key)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/db/models/fields/related_descriptors.py", line 175, in
 __get__
     "%s has no %s." % (self.field.model.__name__, self.field.name)
 django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist:
 BaseLicense has no user.

 The above exception was the direct cause of the following exception:

 Traceback (most recent call last):
   File "./manage.py", line 15, in <module>
     execute_from_command_line(sys.argv)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/__init__.py", line 371, in
 execute_from_command_line
     utility.execute()
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/__init__.py", line 365, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/base.py", line 288, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/base.py", line 335, in execute
     output = self.handle(*args, **options)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/commands/loaddata.py", line 72, in handle
     self.loaddata(fixture_labels)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/commands/loaddata.py", line 113, in
 loaddata
     self.load_label(fixture_label)
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/management/commands/loaddata.py", line 168, in
 load_label
     for obj in objects:
   File "/home/kal/.virtualenvs/nk_test-5iWsqJVv/lib/python3.6/site-
 packages/django/core/serializers/json.py", line 73, in Deserializer
     raise DeserializationError() from exc
 django.core.serializers.base.DeserializationError: Problem installing
 fixture '/home/kal/git/nk_test/./fixtures/dumpdata.json':
 }}}

 Here are the exact steps:
 1. Create model instances in management shell
 {{{
 >>> from django.contrib.auth import get_user_model
 >>> User = get_user_model()
 >>> kal = User.objects.create_user('kal', 'k...@foobar.com', 'qwer1234')
 >>> from licenses.models import AdobePhotoshopLicense
 >>> l = AdobePhotoshopLicense.objects.create(user=kal,
 license_key='12345')
 }}}

 2. Dump the data into a fixtures json
 {{{
 $ python manage.py  dumpdata -o fixtures.json --format json --natural-
 foreign --natural-primary auth licenses
 }}}

 3. Edit settings.py to switch to an empty database
 {{{
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.postgresql',
         #'NAME': 'nk_test',
         'NAME': 'nk_test_2',
         'USER': 'kal',
         'HOST': '',
         'PORT': 5432,
     }
 }
 }}}

 4. Run migrations on the new empty database
 {{{
 $ python manage.py migrate
 }}}

 5. Try to load the data from fixtures.json
 {{{
 $ python manage.py loaddata --format json fixtures.json
 }}}

 I have attached the models.py and fixtures.json file to the ticket.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28972>
Django <https://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 unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.667e16e0c9f15af915743afb5ff50007%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to