Django Import-Export的问题:CSV导入时的验证错误

56lgkhnf  于 5个月前  发布在  Go
关注(0)|答案(1)|浏览(67)

我目前正在做一个Django项目,我正在使用django-import-export库通过Django管理界面将CSV数据导入到我的模型中。我已经在管理界面中设置了资源,模型并进行了必要的更改,但在导入过程中我面临验证错误。
我在Django项目中有以下结构:
models.py:包含各种模型的定义,如PlayStyles、Coaches、Stadium、Leagues、Teams、Players、Matches和Statistics。
resources.py:包含每个模型的相应ModelResource类。
admin.py:配置Django管理界面以使用ModelResource类进行数据导入/导出。
CSV文件:我有CSV文件为每个模型与数据导入。
尽管正确设置了资源,但我在为某些模型导入CSV文件时遇到了问题,特别是对于Teams。错误消息提到了与外键字段(体育场,教练和联赛)相关的验证错误。
下面是我的相关代码片段:models.py:

# ... (models for PlayStyles, Coaches, Stadiums, Leagues, etc.)
class Teams(models.Model):
    name = models.CharField(max_length=100)
    established_year = models.IntegerField()
    stadium = models.ForeignKey(Stadiums, on_delete=models.CASCADE)
    coach = models.ForeignKey(Coaches, on_delete=models.CASCADE)
    league = models.ForeignKey(Leagues, on_delete=models.CASCADE)
    number_of_titles = models.IntegerField()

字符串
resources.py:

# ... (resources for PlayStyles, Coaches, Stadiums, Leagues, etc.)
class TeamsResource(resources.ModelResource):
    class Meta:
        model = Teams
        fields = ('name', 'established_year', 'stadium', 'coach', 'league', 'number_of_titles')


admin.py:

# ... (admin configurations for PlayStyles, Coaches, Stadiums, Leagues, etc.)
class TeamsAdmin(admin.ModelAdmin):
    list_display = ('name', 'established_year', 'stadium', 'coach', 'league', 'number_of_titles')
    resource_class = TeamsResource

admin.site.register(Teams, TeamsAdmin)


csv文件teams.csv:

name,established_year,stadium,coach,league,number_of_titles
TeamA,1990,Old Trafford,Jurgen Klopp,Premier League,5
TeamB,1985,Camp Nou,Pep Guardiola,La Liga,3


我怀疑这个问题与我在导入过程中如何处理外键字段有关。如果有任何关于解决这个问题的指导,我将不胜感激。

bxpogfeg

bxpogfeg1#

您可以在导入中使用任何字段作为ForeignKey引用。它不必是主键,但必须正确声明ForeignKeyWidget
举例来说:

# Am guessing your model structure here - adapt accordingly
# You will have to add other ForeignKeyWidget declarations 
# for your other relations
class TeamsResource(resources.ModelResource):
    stadium = fields.Field(
        column_name='stadium',
        attribute='name',
        widget=ForeignKeyWidget(Stadiums, field='name'))

    class Meta:
        model = Book
        fields = ('stadium',)

字符串
这将允许您导入Team对象,并根据导入文件中的体育场名称将其链接到正确的体育场示例。
体育场示例必须已经存在,并且必须通过名称唯一标识。如果不存在,您可以配置django-import-export来创建FK关系。请参阅文档。
显然,您需要根据上面的示例调整您的实现。

相关问题