【问题标题】:Django error: ValueError: Cannot assign "(<Category: Cultural>, True)": "Site.category" must be a "Category" instanceDjango错误:ValueError:无法分配“(<Category:Cultural>,True)”:“Site.category”必须是“Category”实例
【发布时间】:2022-01-29 18:32:52
【问题描述】:

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

-models.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()

我必须承认我对导入的整个过程不是很了解,所以我无法弄清楚如何看..如果您能向我解释一下,将不胜感激。提前致谢!

【问题讨论】:

    标签: python django csv django-models import-from-csv


    【解决方案1】:

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

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

    所以,你需要unpack tuples来提取模型

    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 中的单下划线_ 变量通常用作“一次性”变量名,如here 所述

    【讨论】:

    • 我忘记了,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多