2

django-import-export モジュールが ForeignKeys をどのように処理するかわかりません。ここに簡単な例があります: 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... (および id は空白のまま) のみの CSV/XLS。

ほとんどの場合、ファミリはすでに DB に存在します。Django は正しい ID 番号を見つける必要があります...

admin.py

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 resource definition for foreignkey field? そしてそこのようなもの:django-import-exportを使用したdjango移行の外部キー

自分で一致を見つけるためにbefore_importを使用する必要がありますか?

4

2 に答える 2

2

私はあなたが自分でマッチを見つけなければならないことを理解しました! 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管理者は、システム管理者以外でも使用できるため、DBにない属またはファミリを複製できます...誰かがエラーをより適切に処理するアイデアを持っている場合は、それを読みたいです! また、彼女のIDだけでなく、家族の名前もプレビューに残しておきたいと思います...方法がわかれば、それについて別の質問を投稿しました:Is-it possible to customize the template of preview in django import-書き出す?

于 2015-03-16T06:52:09.177 に答える