【问题标题】:django import-export error `has_errors()` is validating against Resource OR the whole model?django import-export error `has_errors()` 正在验证资源或整个模型?
【发布时间】:2014-03-26 09:33:49
【问题描述】:

我尝试关注:https://github.com/bmihelac/django-import-export/blob/master/docs/getting_started.rst

我将资源定义如下:

from import_export import resources
from core_backend.models.exhibitor import Exhibitor
from django.contrib.auth.models import User
from import_export import fields


class ExhibitorResource(resources.ModelResource):
    email = fields.Field()

    class Meta:
        model = Exhibitor
        fields = ('id', 'stand_id', 'email', 'title')

    def dehydrate_email(self, exhibitor):
        email = User.objects.filter(id=exhibitor.user_id)[0].email
        return email

然后在shell中我尝试:

import tablib
from import_export import resources
from core_backend.models.exhibitor import Exhibitor
from core_backend.models.exhibitor_resource import ExhibitorResource
my_res = ExhibitorResource()
my_res.fields
#{'email': <import_export.fields.Field: email>, u'id': <import_export.fields.Field: id>, 'title': <import_export.fields.Field: title>, 'stand_id': <import_export.fields.Field: stand_id>}
dataset = tablib.Dataset(['', '2', 'w@x.pl', 'fooo'],
                         headers=['id', 'stand_id', 'email', 'title'])
res = my_res.import_data(dataset, dry_run=True)
res.has_errors()
True

是什么原因? has_errors() 正在针对 Resource 或整个模型进行验证?

我的资源定义是:

a) Model Exhibitor的字段子集

b) 添加了额外字段 email 不在 Exhibitor 类中

更新:

我与raise_errors=True一起运行

res = my_res.import_data(dataset, dry_run=True,raise_errors=True)

打印出来:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/resources.py", line 350, in import_data
    six.reraise(*sys.exc_info())
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/resources.py", line 335, in import_data
    self.import_obj(instance, row, real_dry_run)
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/resources.py", line 201, in import_obj
    self.import_field(field, obj, data)
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/resources.py", line 193, in import_field
    field.save(obj, data)
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/fields.py", line 83, in save
    setattr(obj, self.attribute, self.clean(data))
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/fields.py", line 51, in clean
    value = self.widget.clean(value)
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/import_export/widgets.py", line 137, in clean
    return self.model.objects.get(pk=pk) if pk else None
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/django/db/models/manager.py", line 151, in get
    return self.get_queryset().get(*args, **kwargs)
  File "/Users/andi/.virtualenvs/daftdjango/lib/python2.7/site-packages/django/db/models/query.py", line 307, in get
    self.model._meta.object_name)
DoesNotExist: Stand matching query does not exist.

【问题讨论】:

    标签: python django django-import-export


    【解决方案1】:

    这是一个非常古老的问题,但如果有人遇到同样的问题,这里有一个可能的答案。 Django 之所以提出这个问题,是因为模型 Exhibitor 有一个字段附加到 Stand 模型中的外键。 (我在我的项目中解决了一个类似的问题,在模型中添加了相应的值)。

    对于这种情况,stand_id 应该存在于Stand 模型中:

    展台型号:

    stand_id, my_column
    2, my_value
    

    那么我们可以使用:

    dataset = tablib.Dataset(['', '2', 'w@x.pl', 'fooo'],
                             headers=['id', 'stand_id', 'email', 'title'])
    

    既然stand_id2存在,错误应该就没有了……

    【讨论】:

      猜你喜欢
      • 2018-09-25
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多