簡體   English   中英

在 django-import-export 中處理外鍵的導入

[英]Dealing with import of foreignKeys in django-import-export

我不明白 django-import-export 模塊如何處理外鍵。 這是一個簡單的例子:models.py

class TFamilies(models.Model):
    id_fam = models.AutoField(primary_key=True, unique=True)
    name_fam = models.CharField(max_length=1024, blank=True,verbose_name='Famille')


class TGenus(models.Model):
    id_genus = models.AutoField(primary_key=True, unique=True)
    name_genus = models.CharField(max_length=1024,verbose_name='nom de genre')
    id_fam = models.ForeignKey(TFamilies, null=True, db_column='id_fam', blank=True, verbose_name='Famille')

我想允許人們添加與家庭相關的屬! 只有 name_genus 和 name_fam... 的 CSV/XLS(並且 id 留空)。

大多數時候家庭已經存在於數據庫中,Django juste 必須找到正確的 ID 號...

管理文件

class TGenusResource(resources.ModelResource):

    name_fam = fields.Field(widget=widgets.ForeignKeyWidget(TFamilies, 'name_fam'))

    class Meta:
        model = TGenus
        import_id_fields = ['id_genus']


class TGenusAdmin(ImportExportActionModelAdmin):
    form = TGenusAdminForm
    resource_class = TGenusResource
    pass

此配置導致導入界面出錯:

Line number: 1 - 'NoneType' object has no attribute 'name_fam'
Traceback (most recent call last):
File "/....../lib/python2.7/site-packages/import_export/resources.py", line 348, in import_data
row_result.object_repr = force_text(instance)
File "......./lib/python2.7/site-packages/django/utils/encoding.py", line 85, in force_text
s = six.text_type(s)
AttributeError: 'NoneType' object has no attribute 'name_fam'

我不明白...我也試過在那里回答:外鍵字段的 django-import-export 資源定義? 有點像: 使用 django-import-export 進行 django 遷移的外鍵

我是否必須使用before_import才能找到匹配項?

我發現你必須找到自己的比賽! 改變 tablib 數據集中的值是不可能的,因此您必須對條目進行更改並將它們放回新行,然后刪除舊的。

我的 excel 模板包含列id_genus (空)、 name_genusid_fam由家庭名稱填充!

對於登陸這里的任何人,我發布我的方式:

def before_import(self, dataset, dry_run):
        """
        Make standard corrections to the dataset before displaying to user
        """

        i = 0
        last = dataset.height - 1

        # for all lines, search for id of family given and add a new line at the bottom with it then delete the first one
        while i <= last:
            # Check if the Genus exist in DB
            if (TGenus.objects.filter(name_genus=dataset.get_col(2)[0].capitalize())):
                id_genus = TGenus.objects.filter(name_genus=dataset.get_col(2)[0].capitalize())[0].id_genus
            else :
                id_genus = ''
            # Check if the family exists in DB
            try:
                TFamilies.objects.get(name_fam=dataset.get_col(2)[0].capitalize())
            except TFamilies.DoesNotExist:
                raise Exception("Family not in DB !")                   
            except TFamilies.MultipleObjectsReturned:
                pass

            # use of "filter" instead of "get" to prevent duplicate values, select the first one in all cases
            dataset.rpush((id_genus,
                dataset.get_col(1)[0],
                TFamilies.objects.filter(name_fam=dataset.get_col(2)[0].capitalize())[0].id_fam))
            dataset.lpop()
            i = i + 1

我的 django 管理員可以由非系統管理員使用,因此,他們可以復制不在數據庫中的屬或科...如果有人有更好地處理錯誤的想法,我想閱讀它! 另外,我想在預覽中保留家庭的名字,而不僅僅是她的 id ......如果你知道如何,我已經發布了另一個問題: Is- it possible to custom the template of preview in django import-出口?

我相信您需要根據模型 TGenus 中的字段名稱重命名:

  id_fam = fields.Field(widget=widgets.ForeignKeyWidget(TFamilies, 'name_fam')) 
instead of:
  name_fam = fields.Field(widget=widgets.ForeignKeyWidget(TFamilies, 'name_fam'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM