Django импорт экспорт расширенный пользователь - PullRequest
1 голос
/ 19 апреля 2020

Я пытаюсь использовать Django import-export для импорта данных в мое приложение. Даже с документацией я не могу заставить ее работать для моей модели "Proprietaire", которая расширяет пользовательскую модель Django. Вот мои модели:

class Proprietaire(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    adresse = models.CharField(max_length=500)
    telephone_regex = RegexValidator(
        regex="[0-9]{10}", message="Veuillez entrer un numéro de téléphone valide."
    )
    telephone = models.CharField(validators=[telephone_regex], max_length=10)
    date_inscription = models.DateField(auto_now_add=True)

Кажется, что пользовательский импорт работает нормально, но тогда я не знаю, как импортировать мои Proprietaire s и связать их с моими User s. Прочитав документацию, я попробовал что-то вроде этого в моем админ-файле:

class ProprietaireResource(ModelResource):

    class Meta:
        model = Proprietaire
        fields = ('user__username','telephone','adresse')
        import_id_fields = ('user__username')


@admin.register(Proprietaire)
class ProprietaireAdmin(ImportExportModelAdmin):
    resource_class = ProprietaireResource

admin.site.unregister(User)

@admin.register(User)
class UserAdmin(ImportExportModelAdmin):
    pass

Но что бы я ни пытался (без import_id_fields или без fields, или с adrresse как import_id_fields), Я получаю сообщения об ошибках вроде:

Traceback (most recent call last):
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 500, in import_row
instance, new = self.get_or_init_instance(instance_loader, row)
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 277, in get_or_init_instance
instance = self.get_instance(instance_loader, row)
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 265, in get_instance
import_id_fields = [
File "C:\Users\perre\AppData\Local\Programs\Python\Python38\lib\site-packages\import_export\resources.py", line 266, in <listcomp>
self.fields[f] for f in self.get_import_id_fields()
KeyError: 'a'

Я не понимаю, что здесь происходит.

Для информации, я пытаюсь использовать один и тот же файл для импорта User и Proprietaire (Я не думаю, что это должно быть проблемой); Вот пример строки, которую я пытаюсь импортировать:

Заголовки: id, first_name, last_name, user__username, имя пользователя, электронная почта, is_active, адрес, телефонная линия:, Clémentine, PerreautBis, clementine.perreautbis, clementine . perreautbis,example@test.fr, 0,25 rue du Paradis 69003 Lyon, 0203040506

Ответы [ 3 ]

0 голосов
/ 25 апреля 2020

Моим первым предложением было бы разделить User и Proprietaire на отдельные файлы, затем сначала импортировать User и ссылаться на него в Proprietaire, используя ForeignKeyWidget . Вы говорите, что есть импорт пользователя, так что, возможно, вы уже делаете это. Это будет стандартный способ работы с фреймворком, и он должен быть достаточно простым.

Если вы не можете сделать это, и вам нужно иметь и User, и Proprietaire в одном и том же файле csv, тогда я думаю, вам придется создать подкласс Resource и переопределить метод save_instance() для обработки извлечения пользовательских полей и создания / обновления до сохранения экземпляра модели Proprietaire.

0 голосов
/ 29 апреля 2020

Я наконец решил свою проблему. Поскольку для меня было важно хранить все это в одном файле (конечный пользователь должен заполнять импортируемые файлы, и я хотел, чтобы это было как можно более простым для них), и я не думал, что это была проблема, я посмотрел вверх часть виджета только чтобы увидеть, если это будет иметь значение. И это сделал! После прочтения следующей документации: https://django-import-export.readthedocs.io/en/latest/api_widgets.html мой код выглядел следующим образом:

class ProprietaireResource(ModelResource):
    user = Field(column_name='user', attribute='user', widget=ForeignKeyWidget(User, 'username'))
    class Meta:
        model = Proprietaire
        fields = ('id','user','adresse','telephone')

Я переименовал свой столбец "user__username" в "user", и все работало, как и ожидалось :) Спасибо за совет по ForeignKeyWidget.

0 голосов
/ 20 апреля 2020

Добавить "," после имени пользователя в import_id_fields = ('user__username')

Вместо

import_id_fields = ('user__username')

Попробуйте

import_id_fields = ('user__username', )

('user__username') не является итеративным, но строка. Однако, если вы добавите запятую, это будет кортеж и, следовательно, итерация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...