python - 字段 '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)
解决方案
我认为您需要在此处指定您的问题以及 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
推荐阅读
- api - Tumblr API 返回错误代码 1016
- ruby-on-rails - 在 Ruby on rails 应用程序中启用 https ssl
- php - PHP While循环不起作用但没有错误
- java - “不能从静态上下文引用非静态方法”但没有静态变量或方法
- python - how to make django HttpResponse return faster than 1 second
- java - 如果位数和字节数只是翻倍,为什么数据量之间会有如此巨大的差异?
- linux - 是否可以为 perl 模块导入 truetype 字体?
- python - 为用户添加徽章以在 django 中执行任务
- python - 在 Python 中使用 if 条件加速逐行循环
- javascript - 日期对象更改