Django 错误: 值错误: 无法分配 "(<Category: Cultural>, True)" : "Site.category"必须是"Category"实例



我需要创建一个从csv文件导入数据的数据库。按照练习的说明,我为脚本创建了模型和文件,但当我运行命令python manage.py runscript many_load时,标题中出现了错误。这是代码:

-型号.py:

from django.db import models

class Category(models.Model):
category = models.CharField(max_length=128)
def __str__(self):
return self.category
class State(models.Model):
state = models.CharField(max_length=25)
def __str__(self):
return self.state

class Region(models.Model):
region = models.CharField(max_length=25)
def __str__(self):
return self.region
class Iso(models.Model):
iso = models.CharField(max_length=5)
def __str__(self):
return self.iso
class Site(models.Model):
name = models.CharField(max_length=128)
year = models.CharField(max_length=128)
area = models.CharField(max_length=128)
describe = models.TextField(max_length=500)
justify = models.TextField(max_length=500, null=True)
longitude = models.TextField(max_length=25, null=True)
latitude = models.TextField(max_length=25, null=True)
#one to many field
category = models.ForeignKey(Category, on_delete=models.CASCADE)
state = models.ForeignKey(State, on_delete=models.CASCADE)
region = models.ForeignKey(Region, on_delete=models.CASCADE)
iso = models.ForeignKey(Iso, on_delete=models.CASCADE)
def __str__(self):
return self.name

-many_load.py:

import csv
from unesco.models import Site, Category, Iso, Region, State

def run():
fhand = open('unesco/whc-sites-2018-clean.csv')
reader = csv.reader(fhand)
next(reader)
Category.objects.all().delete()
Iso.objects.all().delete()
Region.objects.all().delete()
State.objects.all().delete()
Site.objects.all().delete()
for row in reader:
# print(row)
# print (len(row))
name = row[0]
describe = row[1]
justification = row[2]
year = row[3]
longitude = row[4]
latitude = row[5]
area = row[6]
category = Category.objects.get_or_create(category=row[7])
state = State.objects.get_or_create(state=row[8])
region = Region.objects.get_or_create(region=row[9])
iso = Iso.objects.get_or_create(iso=row[10])
st = Site(category=category, state=state, region=region, iso=iso,
name=name, area=area, describe=describe, year=year, justification=justification,
longitude=longitude, latitude=latitude)
st.save()

我必须承认,我对进口的整个过程不是很了解,所以我不知道怎么看。。如果你能向我解释一下,我将不胜感激。提前感谢!

get_or_create方法返回两个元素的元组:

返回(object,created(的元组,其中object是检索或创建的对象,created是指定是否创建新对象的布尔值。

因此,您需要解压缩元组以提取模型

category, _ = Category.objects.get_or_create(category=row[7])
state, _ = State.objects.get_or_create(state=row[8])
region, _ = Region.objects.get_or_create(region=row[9])
iso, _ = Iso.objects.get_or_create(iso=row[10])
st = Site(category=category, state=state, region=region, iso=iso,
name=name, area=area, describe=describe, year=year, justification=justification,
longitude=longitude, latitude=latitude)

Python中的单个下划线CCD_;"一次性";变量名称,如这里所述

相关内容

最新更新