如何使用CSV中的外键填充Django模型

时间:2018-06-22 15:44:46

标签: python django django-models

我的模型。py:

# Riders models ----------------------------------------
class CategoryTeam(models.Model):

    name = models.CharField(max_length = 256)

    def __str__(self):
        return self.name

class Teams(models.Model):

    name = models.CharField(max_length = 256)
    code = models.CharField(max_length = 10)
    nation = models.CharField(max_length = 10)
    continent = models.CharField(max_length = 10)
    category = models.ForeignKey(CategoryTeam, on_delete=models.CASCADE,)

    def __str__(self):
        return self.name

#-----------------------------------------------------#

我要填充的脚本

from basic_app.models import CategoryTeam,Teams



def populateCat():
    f = open('CategoryCSV.csv')
    reader = csv.reader(f)
    next(reader)
    for row in reader:

        # Create new User Entry
        category = CategoryTeam.objects.get_or_create(name=row[0])[0]

def populateTeamat():
    f = open('FantaDS Project - Teams.csv')
    reader = csv.reader(f)
    next(reader)
    for row in reader:

        # Create new User Entry
        team = Teams.objects.get_or_create(
                                        name = row[0],
                                        code = row[1],
                                        nation = row[2],
                                        continent = row[3],
                                        category = row[4]
                                        )[0]

if __name__ == '__main__':
    print("Populating the databases Cat...Please Wait")
    populateCat()
    print('Populating Complete')
    print("Populating the databases Team...Please Wait")
    populateTeamat()
    print('Populating Complete')

产生的肽段

  

第85行中的“ C:\ Users \ Wynt \ AppData \ Local \ conda \ conda \ envs \ DjangoEnv \ lib \ site-packages \ django \ db \ backends \ utils.py”,_ execute返回self.cursor .execute(sql,params)
  从“ exc_value < br />   文件“ C:\ Users \ Wynt \ AppData \ Local \ conda \ conda \ envs \ DjangoEnv \ lib \ site-packages \ django \ db \ backends \ utils.py”,行_execute中的返回self.cursor.execute( sql,params)
  在执行返回Return.Database.Cursor的第303行中,文件“ C:\ Users \ Wynt \ AppData \ Local \ conda \ conda \ envs \ DjangoEnv \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py”。 execute(self,query,params)django.db.utils.IntegrityError:NOT NULL约束失败:basic_app_teams.category_id

1 个答案:

答案 0 :(得分:0)

  1. 请确保在创建Teams对象时类别永远不会为空,即,值来自csv的行[4]。换句话说,如果row [4]在任何时间点都为空,则将引发异常,因为在Model类别中是强制性外键。要么

    category = models.ForeignKey(CategoryTeam, on_delete=models.CASCADE, null=True, black=True)
    要么 确保创建Teams对象时类别的值永远不会为空

相关问题