首页 > 解决方案 > 如何使用外键将 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 锅炉

标签: pythondjangocsvdjango-modelsdjango-rest-framework

解决方案


代替

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)

推荐阅读