3

私はdjango import-exportライブラリをデータに使用しています。外部キーにまだ存在しないオブジェクトをインポートできないことを除けば、うまく機能します。

オブジェクト (csv の値) が外部キー モデルに存在する場合、正常にインポートされます。

ただし、オブジェクト/値が外部キー モデルに存在しない場合、「一致するクエリが存在しません」と表示され、データはインポートされません。

外部キーに存在しない場合、外部キーモデルに新しいオブジェクトを追加するように指示するにはどうすればよいですか?

Models.py スニペット

class Store(models.Model):

    store_name = models.CharField(max_length=30)
    def __unicode__(self):
        return self.store_name
    #etc

class Product(models.Model):

    Store = models.ForeignKey(Store)
    Category = models.ForeignKey(Category)
    first_name = models.CharField(max_length=30)
    second_name = models.CharField(max_length=30)
...

Admin.py スニペット

admin.site.register(Category)
admin.site.register(Store)

class ProductResource(resources.ModelResource):

     store_name = fields.Field(column_name='store_name', attribute='Store',
                       widget=ForeignKeyWidget(Store, 'store_name'))

    def __unicode__(self):
        return self.store_name.name

    class Meta:
        model = Product
        fields = ('id', 'first_name', 'second_name','store_name')
        export_order = ('id', 'second_name', 'first_name')
        skip_unchanged = False
        report_skipped = False
        widgets = {
                'published': {'format': '%d.%m.%Y'},
                }


class ProductAdmin(ImportExportModelAdmin):
    resource_class = ProductResource
    list_display = ('first_name', 'second_name')

admin.site.register(Product, ProductAdmin)
4

4 に答える 4

2

ForeignKeyWidgetあなたには方法があります

  def clean(self, value):
        val = super(ForeignKeyWidget, self).clean(value)
        return self.model.objects.get(**{self.field: val}) if val else None

あなたはそれをオーバーライドして次のようなことを試みることができますget_or_create...

それはこのように見えるはずです...

from import_export.widgets import ForeignKeyWidget
class MyCustomizationToFKWidget(ForeignKeyWidget):

      def clean(self, value):
            val = super(ForeignKeyWidget, self).clean(value)
            HERE SOME LOGIC OVERRIDEN
于 2015-09-03T08:08:22.117 に答える
1

Resource クラスのbefore_import_row()メソッドで不足している外部キー エントリを作成できます。

class ProductResource(resources.ModelResource):
    ...
    def before_import_row(self, row, **kwargs):
        Store.objects.get_or_create(
            store_name=row.get('store_name')
        )
于 2020-03-25T13:52:38.840 に答える