问题描述
我正在尝试使用 django-import-export 将数据从 csv 文件导入 django db。我的问题是尝试使用 ForeignKey 作为对象上传数据。我已经迁移,遵循文档,但仍然没有解决方案。您可以在 django 管理员中看到我的以下错误:
这是我的带有空白“Id”列的 csv 数据:
models.py
from django.db import models
from django.shortcuts import reverse
from urllib.parse import urlparse
class States(models.Model):
name = models.CharField(max_length=96,blank=False,unique=True)
abbrv = models.CharField(max_length=2,null=True,blank=True)
class Meta:
ordering = ['name']
verbose_name = 'State'
verbose_name_plural = 'States'
def __str__(self):
return f'{self.name}'
class Person(models.Model):
last_name = models.CharField(
max_length=255,help_text="Enter your last name.")
first_name = models.CharField(
max_length=255,help_text="Enter your first name or first initial.")
address = models.CharField(
max_length=255,blank=True,help_text="Enter your street address.")
city = models.CharField(
max_length=255,help_text="Enter your city.")
state = models.ForeignKey('States',to_field='name',on_delete=models.SET_NULL,null=True)
zipcode = models.CharField(max_length=50)
website = models.URLField(
max_length=255,blank=True)
profession = models.CharField(max_length=50,blank=True)
# Meta CLASS
class Meta:
verbose_name = 'Person'
verbose_name_plural = 'Persons'
ordering = ['last_name','first_name']
# TO STRING METHOD
def __str__(self):
"""String for representing the Model object."""
return f'{self.last_name},{self.first_name}'
admin.py:
from django.contrib import admin
from .models import Person,States
from import_export.admin import ImportExportModelAdmin
from import_export.widgets import ForeignKeyWidget
from import_export import fields,resources
class PersonResource(resources.ModelResource):
state = fields.Field(
column_name='state',attribute='state',widget=ForeignKeyWidget(States,'name'))
class Meta:
model = Person
class PersonAdmin(ImportExportModelAdmin):
list_display = ('last_name','first_name','state')
search_fields = ('first_name','last_name' )
resources_class = PersonResource
admin.site.register(Person,PersonAdmin)
admin.site.register(States)
解决方法
我认为您需要在此处的问题中以及向 Django 指定您希望如何处理 id 字段。
您希望它使用 Django id 还是 pk(有时相同有时不同)传播?然后,您将在视图中的某个位置为数据表设置 id=self.id 或 id=self.pk。
您希望数据库创建唯一键吗?
您需要在某处添加一些功能来告诉 Django 如何填写该字段。
此外,如果您希望它创建一个与 Django id 或 pk 不同的 id,那么您需要将该字段添加到您的模型中。
https://docs.djangoproject.com/en/3.1/ref/forms/validation/ https://docs.djangoproject.com/en/3.1/ref/validators/
https://docs.djangoproject.com/en/3.1/ref/forms/api/
或者,也许在表单验证之后,当您创建对象时。为 id=[database function to create unique id] 添加一些东西。
如果您想根据表单中包含的信息创建 id,另一个解决方案可能是使用 templateTag 或 templateFilter 在表单端创建一个值。就像将姓名的最后 4 位与提交时间结合起来一样。
https://docs.djangoproject.com/en/3.1/ref/templates/builtins/ https://docs.djangoproject.com/en/3.1/howto/custom-template-tags/
刚刚重新阅读了您的问题,我不确定,但您可能会问数据库是否可以支持对另一个对象的嵌入引用。 ID 是对另一个模型密钥的引用吗?那是一个完全不同的问题。它是特定于数据库的。
最后的建议:也许重新阅读: https://docs.djangoproject.com/en/3.1/ref/forms/fields/#fields-which-handle-relationships
,发生此错误是因为您的 id 没有收到 id 或 int
值它收到了 str
类型的值 Wyoming
尝试在 id 中传递 int
值