字段“id”需要一个数字 - 将 ForeignKey 上传到 django-import-export

问题描述

我正在尝试使用 django-import-export 将数据从 csv 文件导入 django db。我的问题是尝试使用 ForeignKey 作为对象上传数据。我已经迁移,遵循文档,但仍然没有解决方案。您可以在 django 管理员中看到我的以下错误

enter image description here

这是我的带有空白“Id”列的 csv 数据:

enter image description here

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