我正在尝试从可以为空的模型导入数据BinaryField.数据不包含该字段,我希望在字段中使用空值导入它.如果该字段已存在于给定的数据库中id,则应保持该值不变.
我从fields相应Resource对象的白名单中删除了该字段,并将其添加到exclude黑名单中.但是,我在导入时遇到此错误 - can't pickle memoryview objects.
追溯:
Traceback (most recent call last):
File "/lib/python3.5/site-packages/import_export/resources.py", line 451, in import_row
original = deepcopy(instance)
File "/lib/python3.5/copy.py", line 182, in deepcopy
y = _reconstruct(x, rv, 1, memo)
File "/lib/python3.5/copy.py", line 297, in _reconstruct
state = deepcopy(state, memo)
File "/lib/python3.5/copy.py", line 155, in deepcopy
y = copier(x, memo)
File "/lib/python3.5/copy.py", line 243, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)
File "/lib/python3.5/copy.py", line 174, …Run Code Online (Sandbox Code Playgroud) 从python 3.5迁移到3.6,我的单元测试显示django-import-export和tablib存在问题:
TypeError:cell()缺少1个必需的位置参数:'column'
File "<path>/lib/python3.6/site-packages/tablib/formats/_xlsx.py", line 122, in dset_sheet
cell = ws.cell('%s%s' % (col_idx, row_number))
TypeError: cell() missing 1 required positional argument: 'column'
Run Code Online (Sandbox Code Playgroud)
tablib中的行:
cell = ws.cell('%s%s' % (col_idx, row_number))
Run Code Online (Sandbox Code Playgroud)
事实上,该专栏没有任何论据
我的观点代码:
my_resource = MyModelResource(queryset=my_queryset)
dataset = my_resource.export()
response = HttpResponse(dataset.xlsx, content_type='application/vnd.ms-excel')
Run Code Online (Sandbox Code Playgroud)
这在python3.5中工作正常但在3.6下失败
requirements.txt:
...
tablib==0.12.1
django-import-export==0.7.0
Django==1.11.7
...
Run Code Online (Sandbox Code Playgroud) 我正在尝试将数据导入到我的某个模型中,但它失败了,因为我正在尝试上传foreignKey Id,而不是import-export创建的迭代数.
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
Run Code Online (Sandbox Code Playgroud)
我的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)
Run Code Online (Sandbox Code Playgroud)
我的data.csv
id, name, school_id, Al1EOC, AL2EOC
,'Main st school', 1238008, 12.9, 14.9 …Run Code Online (Sandbox Code Playgroud) 对于Django模型,我使用的是django-import-export包.
如果需要导出更多只有可用的模型字段(如属性或自定义字段),可以使用import_export.fields.Field类和可选dehydrate_<field>方法添加new .
from import_export import resources, fields, instance_loaders
class ProductResource(resources.ModelResource):
categories = fields.Field()
price = fields.Field(attribute='unit_price')
class Meta:
model = Product
def dehydrate_categories(self, product):
return ';'.join(
'/%s' % '/'.join([c.name for c in cat.parents()] + [cat.name])
for cat in product.category.iterator() )
Run Code Online (Sandbox Code Playgroud)
它确实运作良好,但仅适用于出口.那么进口,反向过程呢?dehydrate_方法有一些对应的吗?
到目前为止,我已经覆盖了get_or_init_instance方法:
class ProductResource(resources.ModelResource):
def get_or_init_instance(self, instance_loader, row):
row['unit_price'] = row['price']; row.pop('price')
return super(ProductResource, self).get_or_init_instance(instance_loader, row)
Run Code Online (Sandbox Code Playgroud)
但怀疑这是正确的方法.
将不胜感激任何提示如何处理自定义字段的导入.
我使用了以下教程。我使用了命令
pip install django-import-export,然后添加到已安装的应用程序部分。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'import_export',
'frontend',
'userauth',
'methods',
]
Run Code Online (Sandbox Code Playgroud)
当我运行时python manage.py collectstatic出现错误ModuleNotFoundError: No module named 'import_export'
更新
我已提交功能请求。我们的想法是pass对IntegrittyError的时候由数据库产生unique或unique_together拒绝已经存在于数据库中的记录。
我有以下模型:
class Compositions(models.Model):
composer_key = models.ForeignKey(
Composer,
)
composition = models.CharField(
max_length=383,
)
class Meta(object):
unique_together = (('composer_key', 'composition'), )
Run Code Online (Sandbox Code Playgroud)
在管理界面中使用 django-import-export,而不为idcsv 文件中的每个条目提供一个,...如果一对 csv 文件已经存在,该过程将因完整性错误而中断
duplicate key value violates unique constraint "data_compositions_composer_key_id_12f91ce7dbac16bf_uniq"
DETAIL: Key (composer_key_id, composition)=(2, Star Wars) already exists.
Run Code Online (Sandbox Code Playgroud)
CSV 文件如下:
id composer_key composition
1 Hot Stuff
2 Star Wars
Run Code Online (Sandbox Code Playgroud)
这个想法是skip_row在管理员中使用和实现它。
管理.py:
class CompositionsResource(resources.ModelResource):
class Meta:
model = Compositions
skip_unchanged …Run Code Online (Sandbox Code Playgroud) 我正在使用Django import_export在我的管理页面中实现 CSV 上传。现在我有一个模型,它包含一个外键列,但是对于每次导入,外键列只有一个值。因此,我希望允许用户从下拉列表中选择相关的模型实例,而不是强迫用户自己附加列。为了做到这一点,我需要自定义导入表单,这需要覆盖默认方法import_action和process_import,但到目前为止我的努力没有显示出任何效果。这是我到目前为止所拥有的:
from django import forms
from import_export.forms import ImportForm
from .models import MyModel, RelatedModel
class CustomImportForm(ImportForm):
"""Add a model choice field for a given model to the standard form."""
appended_instance = forms.ModelChoiceField(queryset=None)
def __init__(self, choice_model, import_formats, *args, **kwargs):
super(CustomImportForm, self).__init__(import_formats, *args, **kwargs)
self.fields['appended_instance'].queryset = choice_model.objects.all()
@admin.register(MyModel)
class MyModelAdmin(ImportExportModelAdmin):
resource_class = SomeResource
def import_action(self, request, *args, **kwargs):
super().import_action(self, request, *args, **kwargs)
form = CustomImportForm(RelatedModel,
import_formats,
request.POST or None,
request.FILES or None)
Run Code Online (Sandbox Code Playgroud)
现在,当我进入导入页面时,我得到了 …
我想在的管理显示中显示ip_addressfromHosts模型HostInfo。
# models.py
class Hosts(models.Model):
host_name = models.CharField(max_length=200, unique=True)
ip_address = models.GenericIPAddressField(protocol='both', unpack_ipv4=True)
def __unicode__(self):
return unicode(self.host_name)
def hostip(self):
return unicode(self.ip_address)
Run Code Online (Sandbox Code Playgroud)
我在 admin.py 中有以下内容
# admin.py
class HostInfoResource(resources.ModelResource):
host = fields.Field(column_name='host',
attribute='host',
widget=ForeignKeyWidget(Hosts, 'host_name'))
project = fields.Field(column_name='project',
attribute='project',
widget=ForeignKeyWidget(Project, 'project_name'))
env = fields.Field(column_name='env',
attribute='env',
widget=ForeignKeyWidget(Env, 'env_name'))
class Meta:
model = HostInfo
skip_unchanged = True
import_id_fields = ('id', 'host','ticket','deployed_by')
export_order = ('id', 'host', 'nexpose_level','cpus','memory','os',
'sudoers_copied', 'sudo_granted', 'extra_disks','app_type','app_name',
'vcenter_status','ticket','env','project','deployed_by',
'updated_on','created_on')
class HostInfoAdmin(ImportExportModelAdmin):
resource_class = HostInfoResource
list_display …Run Code Online (Sandbox Code Playgroud) 我正在使用django-import-export软件包,期望包含位置名称及其经度和纬度的csv文件。
我想从csv解析经度和纬度字段以将其转换为django.contrib.gis.geos.Point对象,以便可以将其输入到Location模型的geom字段中。
# models.py
from django.contrib.gis.db import models
class Location(models.Model):
name = models.CharField(max_length=200)
geom = models.PointField(null=True, blank=True)
def __str__(self):
return self.name
# admin.py
from .models import Location
from import_export import resources
from import_export.admin import ImportExportModelAdmin
class LocationResource(resources.ModelResource):
geom = Field()
latitude = Field()
longitude = Field()
class Meta:
model = Location
fields = ('id','name', 'latitude', 'longitude')
exclude = ('geom')
export_order = ('id', 'name', 'latitude', 'longitude')
def dehydrate_geom(self, data):
return Point(data.longitude, data.longitude)
class LocationAdmin(ImportExportModelAdmin):
resource_class …Run Code Online (Sandbox Code Playgroud) 我正在关注有关如何使用 django-import-export 的文档:
https://django-import-export.readthedocs.io/en/latest/getting_started.html#declaring-fields
我有一个如下所示的 excel 表
我想在这个模型中存储数据:
class ExcelData(models.Model):
var1 = models.CharField(max_length=200)
var2 = models.CharField(max_length=200,unique=True)
var3 = models.CharField(max_length=200)
var4 = models.CharField(max_length=200)
Run Code Online (Sandbox Code Playgroud)
这是我走了多远:
@admin.register(ExcelData)
class ViewAdmin(ImportExportModelAdmin):
exclude = ('id',)
class ExcelDataResource(resources.ModelResource):
var1 = Field(attribute='var1', column_name='Name')
var2 = Field(attribute='var2', column_name='SAP_ID')
var3 = Field(attribute='var3', column_name='Abbreviation')
var4 = Field(attribute='var4', column_name='Max. Capa')
class Meta:
model = ExcelData
import_id_fields = ('var2',)
exclude = ('id',)
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
这是 CSV 文件:
http://www.sharecsv.com/s/9d1112392cd7f10378de7fc0811dd0c9/REAL_CSV_SIMPLE.csv
当我尝试像这样导入多行时:
我收到此错误:
Line number: 2 - UNIQUE constraint failed: myapp_exceldata.var2
b, e, h, k
Traceback (most …Run Code Online (Sandbox Code Playgroud)