Skip to content

Importing recursive/nested/self-referring model #1204

@firdaus-aziz

Description

@firdaus-aziz

models.py

class Location(models.Model):
    name = models.CharField(max_length=40)
    parent = models.ForeignKey(
        to="self",
        on_delete=models.CASCADE,
        related_name="children",
        blank=True,
        null=True,
        default=None,
    )
    depth = models.PositiveSmallIntegerField(default=0, editable=False)

    def save(self, *args, **kwargs):
    	if self.parent and self.parent.depth < 6:
		self.depth = self.parent.depth + 1
	    super().save(*args, **kwargs)

resources.py

class LocationResource(resources.ModelResource):
    parent = fields.Field(
        column_name="parent",
        attribute="parent",
        widget=ForeignKeyWidget(Location, "id"),
    )

    class Meta:
        model = Location

sample data

id,name,parent,depth
1,Selangor,,0
2,Terengganu,,0
3,Kuala Terengganu,2,1
4,Petaling Jaya,1,1
5,Shah Alam,1,1
6,Kajang,1,1

The error that I'm getting

  File "./manage.py", line 27, in <module>
    main()
  File "./manage.py", line 23, in main
    execute_from_command_line(sys.argv)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/django/core/management/base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/django/core/management/base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "/home/abc/projects/demo/app/core/management/commands/import_from_csv.py", line 63, in handle
    self.import_file(
  File "/home/abc/projects/demo/app/core/management/commands/import_from_csv.py", line 29, in import_file
    mock_import = resource().import_data(
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/resources.py", line 745, in import_data
    return self.import_data_inner(dataset, dry_run, raise_errors, using_transactions, collect_failed_rows, **kwargs)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/resources.py", line 792, in import_data_inner
    raise row_result.errors[-1].error
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/resources.py", line 662, in import_row
    self.import_obj(instance, row, dry_run)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/resources.py", line 516, in import_obj
    self.import_field(field, obj, data)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/resources.py", line 499, in import_field
    field.save(obj, data, is_m2m)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/fields.py", line 110, in save
    cleaned = self.clean(data)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/fields.py", line 66, in clean
    value = self.widget.clean(value, row=data)
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/import_export/widgets.py", line 396, in clean
    return self.get_queryset(value, row, *args, **kwargs).get(**{self.field: val})
  File "/home/abc/.virtualenvs/demo/lib/python3.8/site-packages/django/db/models/query.py", line 429, in get
    raise self.model.DoesNotExist(
location.location.models.DoesNotExist: Location matching query does not exist.

Python: 3.8.5
Django: 3.1.2
Django Import Export: 2.4.0

Kindly point me to the doc or right direction regarding importing self-referring data. I have tried looking for an example but have failed.

My apologies if this is the wrong place to ask.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions