10

モデルの 1 つにデータをインポートしようとしていますが、インポートとエクスポートが作成する反復数ではなく、foreignKey ID をアップロードしようとしているため、失敗しています。

models.py

from django.db import models
from import_export import resources


class School(models.Model):
    name = models.CharField(max_length=100)
    slug = models.CharField(max_length=100)
    school_id = models.IntegerField(unique=True)

class Sol(models.Model):
    school_id = models.ForeignKey(School, to_field='school_id')
    name = models.CharField(max_length = 100)
    Al1EOC = models.DecimalField(max_digits=5, decimal_places=2)
    AL2EOC = models.DecimalField(max_digits=5, decimal_places=2)

#Class for django-import-export
class SolResource(resources.ModelResource):
    class Meta:
        model = Sol

私のadmin.py

from import_export.admin import ImportExportModelAdmin


class SolAdmin(ImportExportModelAdmin):
    list_display = ('name', 'school_id')
    resources_class = SolResource
    pass

admin.site.register(Sol, SolAdmin)

私のデータ.csv

id, name, school_id, Al1EOC, AL2EOC
,'Main st school', 1238008, 12.9, 14.9

SOL モデルからデータをエクスポートすると、学校 ID の反復番号が取得されます。私は実際の学校 ID が必要です。これは、foreignKey 関係を保持するものです。その後、そのforeignKey番号でデータをアップロードする必要があります。ForeignKey ウィジェットがそれを行う方法であることは知っていますが、それがどのように実装されているかわかりません。

4

3 に答える 3

9

ドキュメントにForeignKeyWidgetがあります。ここで使用できます。IntegerWidget と DecimalWidget もあります。

from import_export.admin import ImportExportModelAdmin

class SolResource(resources.ModelResource):
    school_id = fields.Field(
        column_name='school_id',
        attribute='school_id',
        widget=ForeignKeyWidget(School, 'name'))

    class Meta:
        model = Sol

class SolAdmin(ImportExportModelAdmin):
    list_display = ('name', 'school_id')
    resources_class = SolResource

admin.site.register(Sol, SolAdmin)

これは実用的な例です。それが役立つことを願っています。

于 2017-06-22T06:11:45.667 に答える
3

ウィジェットを使用してください-うまくいきます。

school_id = fields.Field(column_name='school_id', attribute='Sol', widget=widgets.ForeignKeyWidget(Sol, 'school_id'))

于 2015-08-26T06:00:21.773 に答える
3

私はそれが役立つと思います:

class SolResource(resources.ModelResource):
    school_id = fields.Field()

    class Meta:
        # ...

    def dehydrate_school_id(self, sol):
        return sol.school_id.school_id # You can get all fields of related model. This is example.
于 2015-03-03T16:11:02.383 に答える