python - 如何使用外键将 CSV 文件导入 django
问题描述
我正在尝试将数据从 csv 文件导入 Django,但我不断收到此错误:
NOT NULL 约束失败:error_boilermodel.ModelBrand_id
我的模型是这样的:
from django.db import models
# Create your models here.
class BoilerBrand(models.Model):
BrandName = models.CharField(max_length=40, blank=False)
def __str__(self):
return self.BrandName
class meta:
db_table = 'Boiler_Brand'
class BoilerModel(models.Model):
ModelBrand = models.ForeignKey('BoilerBrand', on_delete=models.CASCADE,)
ModelName = models.CharField(max_length=600, blank=False)
def __str__(self):
return self.ModelName
class meta:
db_table = 'Boiler_Model'
class BoilerError(models.Model):
BoilerBrand = models.ForeignKey('BoilerBrand', on_delete=models.CASCADE,)
BoilerModel = models.ForeignKey('BoilerModel', on_delete=models.CASCADE,)
ErrorCode = models.CharField(max_length=40, blank=False)
ErrorDesc = models.CharField(max_length=200, blank=False)
ErrorFix = models.CharField(max_length=200, blank=False, default="Call a technician")
def __str__(self):
return self.ErrorCode
class meta:
db_table = 'Boiler_Error'
我的导入代码是这样的:
import csv
from error.models import BoilerError,BoilerBrand,BoilerModel
ImportBrandName = "worcester-bosch"
def run():
file = open("D:/python tratining/boilererror/error/csv-error-codes/worcester-bosch-error-codes-Copy.csv")
reader = csv.reader(file)
BoilerError.objects.all().delete()
BoilerModel.objects.all().delete()
BoilerBrand.objects.all().delete()
for row in reader:
print(row)
a, created = BoilerBrand.objects.get_or_create(BrandName=ImportBrandName)
b, created = BoilerModel.objects.get_or_create(ModelName=row[2])
c, created = BoilerModel.objects.get_or_create(ModelBrand=ImportBrandName)
d, created = BoilerError.objects.get_or_create(BoilerBrand=ImportBrandName)
e, created = BoilerError.objects.get_or_create(ErrorCode=row[0])
f, created = BoilerError.objects.get_or_create(ErrorDesc=row[1])
g, created = BoilerError.objects.get_or_create(ModelName="Contact a Technician")
这是我正在使用的 CSV 示例:
200 O , 锅炉在加热模式 , Greenstar 8000 锅炉
201 O ,热水模式锅炉 , Greenstar 8000 锅炉
解决方案
代替
b, created = BoilerModel.objects.get_or_create(ModelName=row[2])
c, created = BoilerModel.objects.get_or_create(ModelBrand=ImportBrandName)
利用
b, created = BoilerModel.objects.get_or_create(ModelName=row[2], ModelBrand=a)
推荐阅读
- tensorflow - 如何将需要 one-hot 编码的分类数据与 tensorflow 中的连续数据混合?
- php - PHP | 在 Ajax 请求中获取 ERR_CONTENT_DECORDING_FAILED
- python - 如何将两个系列转换为数据框的两个单独列?
- vba - 在应用到项目任务 VBA MS 项目之前检查资源的可用性
- .net-core - corefx 源没有按预期重建
- portable-executable - AddressOfEntryPoint 中的 PE 文件格式有误?
- c - 如何将数组放入 int 但使用 scanf
- android - 用于创建 apk 的 android gradle/gradlew 命令行构建
- javascript - 创建一个反应项目
- tomcat - 当我尝试在 URL 中发送特殊字符时,Tomcat 正在返回 HTTP 状态 400 - 错误请求状态