首页 > 解决方案 > 字段 'id' 需要一个数字 - 将 ForeignKey 上传到 django-import-export

问题描述

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

在此处输入图像描述

这是我的 csv 数据,其中有一个空白的“Id”列:

在此处输入图像描述

模型.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, blank=True, 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}'

管理员.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)

标签: pythondjangodjango-import-export

解决方案


我认为您需要在此处指定您的问题以及 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


推荐阅读