Добавьте дополнительное значение из ImportForm в экземпляр модели перед импортом или сохранением
У меня есть следующая модель, которую я хочу импортировать:
class Token(models.Model):
key = models.CharField(db_index=True,unique=True,primary_key=True, )
pool = models.ForeignKey(Pool, on_delete=models.CASCADE)
state = models.PositiveSmallIntegerField(default=State.VALID, choices=State.choices)
тогда модель ресурса:
class TokenResource(resources.ModelResource):
class Meta:
model = Token
import_id_fields = ("key",)
и ImportForm для запроса пула:
class AccessTokenImportForm(ImportForm):
pool = forms.ModelChoiceField(queryset=Pool.objects.all(), required=True)
Это значение должно быть установлено для всех импортированных объектов токенов. Проблема в том, что я пока не нашел способа реализовать это.
Как получить значение из формы в экземпляр?
В методах before_save_instance и подобных я больше не могу получить доступ к этим значениям. Я должен передавать их намного раньше, я полагаю. Кто-нибудь когда-нибудь делал что-то подобное?
Спасибо и пожелания Matt
Кажется, что вы можете передать дополнительное значение в Admin:
class TokenAdmin(ImportMixin, admin.ModelAdmin):
def get_import_data_kwargs(self, request, *args, **kwargs):
form = kwargs.get('form')
if form:
kwargs.pop('form')
if 'pool' in form.cleaned_data:
return {'pool_id' : form.cleaned_data['pool'].id }
return kwargs
return {}
А затем используйте эти данные в методе ваших ресурсов after_import_instance для установки этого значения
def after_import_instance(self, instance, new, row_number=None, **kwargs):
pool_id = kwargs.get('pool_id')
instance.pool_id = pool_id
instance.created_at = timezone.now()
Тогда ошибка отсутствия поля (не нулевого) исчезнет.