4

管理パネルでDjango-import-exportモジュールを使用しています。Django myapp データベースのレコードを更新する ERM システムから抽出した .csv ファイルをインポートします。一部のレコードが ERM から削除され、.csv データダンプに存在しない場合、レコードが存在しないため、Django データベースで更新が行われないことを除いて、すべてが魔法のように機能します。

.csv ファイルをインポートするときに、前述の .csv ファイルに存在しないすべてのレコードを変更または削除する (できればレコード名を「削除済み」に変更する) 句を書きたいと思います。レコードは、データベースの主キーである「番号」列によって識別されます。

私が見つけた最も近い解決策は、アップロードされたファイルに「削除」列を追加して「1」を設定することでしたが、そもそもこれらのレコードが存在しないため、それは役に立ちません。

私のadmin.pyは次のようになります。

from django.contrib import admin
from .models import Supplier, SiteServices
from import_export import resources, widgets, fields
from import_export.admin import ImportExportModelAdmin


# Register your models here.
class SupplierResource(resources.ModelResource):
    delete = fields.Field(widget=widgets.BooleanWidget())

    def for_delete(self, row, instance):
        return self.fields['delete'].clean(row)

    class Meta:
        model = Supplier
        import_id_fields = ['number']


class SupplierAdmin(ImportExportModelAdmin, admin.ModelAdmin):
    resource_class = SupplierResource

admin.site.register(Supplier, SupplierAdmin)
4

2 に答える 2

1

これは、私がこのために実装した実用的な例です。これは、bmihelac が示唆するのと同じアプローチです。

インポート ファイル内のインスタンスの保存を処理する独自の ModelResource と、他のすべての行の削除を処理するメソッドを作成します。

import import_export
class MyModelResource(import_export.resources.ModelResource):

    def after_import_instance(self, instance, new, **kwarg):
        """ For each row in the import file, add the pk to the list """
        self.imported_rows_pks.append(instance.pk)

    def after_import(self, dataset, result, using_transactions, dry_run, **kwargs):
        """  delete all rows not in the import data set. Then call the same method in the parent to still sequence the DB """
        self.Meta.model.objects.exclude(pk__in=self.imported_rows_pks).delete()
        import_export.resources.ModelResource.after_import(self, dataset, result, using_transactions, dry_run, **kwargs)

削除する代わりに、次のように言うこともできます。

self.Meta.model.objects.exclude(pk__in=self.imported_rows_pks).update(deleted=True)

次に、拡張された MyModelResource に基づいていることを除いて、通常どおりに import export Resource を作成します。

class SupplierResource(MyModelResource):
    imported_rows_pks = []

    class Meta:
        model = Supplier
        import_id_fields = ['number']
于 2017-10-23T15:37:17.540 に答える