Django-import-export: Номер строки: 1 - get() вернула более одного блока - вернула 2
Я импортирую данные в model/table
с внешним ключом.
Он загружает некоторые строки, но исключает другие, выбрасывая ошибку в виде:
Line number: 1 - get() returned more than one Block -- it returned 2!
, HARYANA, 11, FATEHABAD, 195, FATEHABAD, 641, AHLISADAR, 57891
Traceback (most recent call last):
File "/home/webtesting/django_venv/lib/python3.9/site-packages/import_export/resources.py", line 660, in import_row
self.before_import_row(row, **kwargs)
File "/home/webtesting/Excel/DAMU_Excel_Upload_AMFU_DAMU/damuwhatsapp/resources.py", line 89, in before_import_row
(cat, _created) = Block.objects.get_or_create(block_name=block_name)
File "/home/webtesting/django_venv/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/webtesting/django_venv/lib/python3.9/site-packages/django/db/models/query.py", line 657, in get_or_create
return self.get(**kwargs), False
File "/home/webtesting/django_venv/lib/python3.9/site-packages/django/db/models/query.py", line 499, in get
raise self.model.MultipleObjectsReturned(
damuwhatsapp.models.Block.MultipleObjectsReturned: get() returned more than one Block -- it returned 2!
Но он выдает ошибки для других строк, имеющих аналогичную структуру данных
Данные в формате CSV выглядят следующим образом:
Файл models.py имеет вид:
####################################################################################
class Village(models.Model):
state_name = models.CharField(max_length=50)
state_id = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(100)])
district_name = models.CharField(max_length=50)
district_id = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(1000)])
block_name = models.ForeignKey(Block, on_delete=models.CASCADE)
block_id = models.PositiveIntegerField(validators=[MinValueValidator(1), MaxValueValidator(8000)])
village_name = models.CharField(max_length=50)
village_id = models.PositiveIntegerField(unique=True, validators=[MinValueValidator(1), MaxValueValidator(750000)])
class Meta:
db_table = 'Village_Names'
def __str__(self):
return self.village_name
Файл resource.py имеет вид:
где я исключил столбец id
, так как он пустой
а имя_блока является внешним ключом из другой модели
class VillageResource(resources.ModelResource):
state_name = fields.Field(column_name="state_name", attribute="state_name")
state_id = fields.Field(column_name="state_id", attribute="state_id")
district_name = fields.Field(column_name="district_name", attribute="district_name")
district_id = fields.Field(column_name="district_id", attribute="district_id")
block_name = fields.Field(column_name='block_name',
attribute='block_name',
widget=ForeignKeyWidget(Block, 'block_name'))
block_id = fields.Field(column_name="block_id", attribute="block_id")
village_name = fields.Field(column_name="village_name", attribute="village_name")
village_id = fields.Field(column_name="village_id", attribute="village_id")
class Meta:
model = Village
exclude = ['id']
skip_unchanged = True
report_skipped = True
import_id_fields = ('state_name', 'state_id','district_name','district_id','block_name','block_id', 'village_name','village_id')
def before_import_row(self, row, **kwargs):
block_name = row.get('block_name')
(cat, _created) = Block.objects.get_or_create(block_name=block_name)
row['block_name'] = cat.block_name
Файл admin.py имеет вид:
class VillageAdmin(ImportExportModelAdmin, admin.ModelAdmin):
resource_class = VillageResource
list_display = ['id', 'state_name', 'state_id','district_name','district_id','block_name','block_id', 'village_name','village_id']
search_fields = ["village_name"]
filter_horizontal = ()
list_filter = ()
fieldset = ()
admin.site.register(Village, VillageAdmin)
Таблица модели Village выглядит так:
Почему модель принимает значения одних строк и выдает ошибку в других? и как это исправить?
Не уверен, чего ты пытаешься добиться, приятель.
В соответствии с трассировкой стека, у вас есть следующий код:
(cat, _created) = Block.objects.get_or_create(block_name=block_name)
get_or_create
извлекает один (1) экземпляр модели или создает новый, если не найдено ни одного, соответствующего заданным критериям (имя_блока=имя_блока). Но у вас есть несколько строк (в вашей базе данных) с одним и тем же block_name
. Следовательно, Django выбрасывает исключение MultipleObjectsReturned
, поскольку, как уже говорилось, этот метод используется для получения одного единственного экземпляра.