Оригинальный вопрос был размещен здесь: https://github.com/django-import-export/django-import-export/issues/886
Привет всем,
У меня есть документ xslx со следующими столбцами:
категория | место проведения | событие | вопрос | ответ | клиент | Действие
Категория, Место проведения, Событие и Клиент - ForeignKeys. Если они не существуют, они должны быть созданы, поэтому я создал пользовательские ForeignKeyWidgets:
class ForeignKeyWidgetWithCreation(ForeignKeyWidget):
def __init__(
self,
model,
field='pk',
create=False,
*args, **kwargs):
self.model = model
self.field = field
self.create = create
# super(ForeignKeyWidgetWithCreation, self).__init__(*args, **kwargs)
def clean(self, value, row=None, *args, **kwargs):
val = super(ForeignKeyWidgetWithCreation, self).clean(value)
if self.create:
instance, new = self.model.objects.get_or_create(**{
self.field: val
})
val = getattr(instance, self.field)
return self.model.objects.get(**{self.field: val}) if val else None
# Event Widget
class EventWidget(ForeignKeyWidget):
def __init__(
self,
model,
field='pk',
create=False,
*args, **kwargs):
self.model = model
self.field = field
self.create = create
# super(ForeignKeyWidgetWithCreation, self).__init__(*args, **kwargs)
def clean(self, value, row=None, *args, **kwargs):
val = super(ForeignKeyWidgetWithCreation, self).clean(value)
if self.create:
instance, new = self.model.objects.get_or_create(**{
self.field: val
})
val = getattr(instance, self.field)
return self.model.objects.get(**{self.field: val}) if val else None
# CLIENT WIDGET
class ClientWidget(ForeignKeyWidget):
def __init__(self, model, field='client', *args, **kwargs):
self.model = Client
self.field = field
def clean(self, value, row=None, *args, **kwargs):
val = super(ClientWidget, self).clean(value)
if val:
client = Client.objects.get_or_create(name=val)
return client
# return self.get_queryset(value, row, *args, **kwargs).get(**{self.field: val})
else:
return None
# VENUE WIDGET
class VenueWidget(ForeignKeyWidget):
def __init__(self, model, field='pk', *args, **kwargs):
self.model = model
self.field = field
self.other_widget = ClientWidget(model=Client)
def clean(self, value, row=None, *args, **kwargs):
client = self.other_widget.clean(row['client'], row)
print(client)
return self.model.objects.get_or_create(venue=value, client=client)
Мой ресурс модели выглядит следующим образом:
class QuestionResource(resources.ModelResource):
category = fields.Field(
column_name='category',
attribute='category',
widget=ForeignKeyWidgetWithCreation(Category, 'category')
)
venue = fields.Field(
column_name='venue',
attribute='venue',
widget=VenueWidget(Venue, 'venue')
)
event = fields.Field(
column_name='event',
attribute='event',
widget=ForeignKeyWidgetWithCreation(Event, 'event')
)
client = fields.Field(
column_name='client',
attribute='client',
widget=ClientWidget(Client, 'name')
)
class Meta:
model = Question
fields = ['id', 'question', 'venue', 'category', 'answer', 'event', 'client']
Моя модель НЕ имеет отношения к полю клиента, но я хочу создать нового Клиента на основе того, существует он или нет.
В настоящее время, когда я загружаю файл xlsx, я получаю следующую ошибку:
django.core.exceptions.FieldError: Cannot resolve keyword 'client' into field. Choices are: created, id, modified, name, profile, question, update, venue
Я понимаю, почему это происходит, но я не могу понять, как получить доступ к значению другого столбца и использовать его для создания отношения для других моих чужих ключей.
Когда создаются модели Venue и Event, им нужна родительская модель Client. Поскольку мой вопрос не имеет такого отношения, мне нужно создать его, чтобы можно было создавать другие мои модели (событие и место).
Заранее спасибо!