bimka
@bimka
Осваиваю Питон

Откуда взялось ключевое слово «category»?

пытаюсь при помощи скрипта many_load.py переместить из таблицы данные в базу данных. При выполнении в консоли команды "python manage.py runscript many_load" выдает ошибку:
"Choices are: %s" % (name, ", ".join(available)))
django.core.exceptions.FieldError: Cannot resolve keyword 'category' into fiel
d. Choices are: id, name, site"

Я понимаю, что программа не находит ключевое слово "category", и что выбор только из "id", "name", "site", но в модели "category" нет. Почему он его ищет? и как избежать этой проблемы?

models.py:
from django.db import models

class Category(models.Model) :
    name = models.CharField(max_length=512)

    def __str__(self) :
        return self.name

class State(models.Model) :
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Region(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name

class Iso(models.Model):
    name = models.CharField(max_length=8)

    def __str__(self):
        return self.name


class Site(models.Model):
    name = models.CharField(max_length=128)
    description = models.CharField(max_length=256)
    justification = models.CharField(max_length=256)
    year = models.IntegerField(null=True)
    longitude = models.DecimalField(max_digits=20, decimal_places=10, null=True)
    latitude = models.DecimalField(max_digits=20, decimal_places=10, null=True)
    area_hectares = models.DecimalField(max_digits=20, decimal_places=10,null=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True)
    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 Category, State, Region, Iso, Site


def run():
    fhand = open('unesco/whc-sites-2018-clean.csv')
    reader = csv.reader(fhand)
    next(reader)  # Advance past the header

    Category.objects.all().delete()
    State.objects.all().delete()
    Region.objects.all().delete()
    Iso.objects.all().delete()
    Site.objects.all().delete()



    for row in reader:
        print(row)

        c, created = Category.objects.get_or_create(category=row[7])
        s, created = State.objects.get_or_create(state=row[8])
        r, created = Region.objects.get_or_create(region=row[9])
        i, created = Iso.objects.get_or_create(iso=row[10])

        try:
            y = int(row[3])
        except:
            y = None

        st = Site(name=row[0], description=row[1], justification=row[2],
            year=y, longitude=row[4], latitude=row[5], area_hectares=row[6],
            category=c, state=s, region=r, iso=i)
        st.save()
  • Вопрос задан
  • 84 просмотра
Решения вопроса 1
@rodion4dev
c, created = Category.objects.get_or_create(category=row[7])


Именно отсюда (см. выше) и берётся ключевое слово category. Скорее всего Вам нужно вот так: Category.objects.get_or_create(name=row[7])
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы