【问题标题】:Django import export, get() returned more than onedjango导入导出,get()返回不止一个
【发布时间】:2020-09-19 14:43:09
【问题描述】:

当你使用 django-import-export 时,请帮我找到解决这个错误的方法 这是我的代码:

型号:

class ChartOfAccounts(models.Model):
code = models.CharField('code plan comptable', max_length=20, unique=True)
name = models.CharField('plan comptable', max_length=100)

def __str__(self):
    return self.code


class Company(models.Model):
    code = models.CharField('code société', max_length=20, unique=True)
    name = models.CharField('société', max_length=100)
    addr = models.CharField('adresse', max_length=100, blank=True, null=True)
    chart_of_accounts = models.ForeignKey(ChartOfAccounts, on_delete=models.CASCADE, verbose_name='code plan comptable')
    
    def __str__(self):
    return self.code


class GLAccount(models.Model):
    class Meta:
        unique_together = (('code', 'chart_of_accounts'),)

    code = models.CharField('code compte comptable', max_length=10)
    chart_of_accounts = models.ForeignKey(ChartOfAccounts, on_delete=models.CASCADE, verbose_name='code plan comptable')
    name = models.CharField('compte comptable', max_length=100, help_text='text descriptif du compte comptable')
    
    def __str__(self):
        return f'{self.code}, {self.chart_of_accounts}'


class CompanyAccount(models.Model):
    company = models.ForeignKey(Company, verbose_name='code société', on_delete=models.CASCADE)
    gl_account = models.ForeignKey(GLAccount, verbose_name='compte comptable', on_delete=models.CASCADE)

资源:

class CompanyAccountResource(ModelResource):
    class Meta:
        model = models.CompanyAccount
        fields = ('company', 'gl_account',)
        exclude = ('id',)
        import_id_fields = ('company', 'gl_account',)
        skip_unchanged = False
        report_skipped = False

    # fields
    company = Field(
        column_name=Meta.model._meta.get_field('company').verbose_name,
        attribute='company',
        widget=ForeignKeyWidget(models.Company, field='code')
    )
    gl_account = Field(
        column_name=Meta.model._meta.get_field('gl_account').verbose_name,
        attribute='gl_account',
        widget=ForeignKeyWidget(models.GLAccount, field='code')
    )

    def get_export_order(self):
        export_fields = ['company', 'gl_account', ]
        return export_fields

我的数据是:

Company model data here

ChatOfAccounts model data here

GLAccount model data here

CompanyAccountResource Excel canvas to import data

问题:

一个GLAccount代码可能出现在2个会计科目表中,每个与一个公司相关,当尝试从excel导入数据到CompanyAccountResource时,会出现以下错误:

    Line number: 1 - get() returned more than one GLAccount -- it returned 2!
S001, 600000
Traceback (most recent call last):
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\import_export\resources.py", line 639, in import_row
instance, new = self.get_or_init_instance(instance_loader, row)
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\import_export\resources.py", line 334, in get_or_init_instance
instance = self.get_instance(instance_loader, row)
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\import_export\resources.py", line 327, in get_instance
return instance_loader.get_instance(row)
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\import_export\instance_loaders.py", line 29, in get_instance
params[field.attribute] = field.clean(row)
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\import_export\fields.py", line 66, in clean
value = self.widget.clean(value, row=data)
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\import_export\widgets.py", line 396, in clean
return self.get_queryset(value, row, *args, **kwargs).get(**{self.field: val})
File "C:\Users\Leo\PycharmProjects\Django\DjangoSnippets\venv\lib\site-packages\django\db\models\query.py", line 433, in get
raise self.model.MultipleObjectsReturned(
app1.models.GLAccount.MultipleObjectsReturned: get() returned more than one GLAccount -- it returned 2!

【问题讨论】:

    标签: django django-import-export


    【解决方案1】:

    发生错误是因为您正在定义 import_id_fields 哪个 don't uniquely identify an object

    import_id_fields 被导入工作流用于识别现有模型实例以进行更新。在您的情况下,“company”、“gl_account”的组合正在识别CompanyAccountResource 中的多行。

    如果您需要导入逻辑来更新现有实例,那么您必须找到一种方法来唯一标识要更新的行。

    【讨论】:

    • 谢谢 Matthew,我尝试在 Resource 类中使用 befor_import_row 方法根据值 row['compte comptable']; 确定正确的 GLAccount 实例;如果可行,我会给你反馈;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多