#python #django #django-models #django-filter
#python #django #django-модели #django-filter
Вопрос:
Я пытаюсь загрузить CSV-файл в таблицу django. Я не могу сопоставить данные с внешними ключами. ‘cpt’ — это внешний ключ от модели цена -сервис. Существует множество строк цен, которые сопоставляются с одной строкой cpt, но каждая отдельная строка содержит только одну cpt.
Вот мой код загрузки.
path = "/Users/joannerodrigues/Documents/csv_import/"
os.chdir(path)
from catalog.models import Service, Price
with open('price.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
p = Price(com_desc=row['com_desc'],
service=Service.objects.filter(cpt=str(row['cpt']))[0])
p.save()
Это ошибка, которую я получаю:
site-packages/django/db/models/query.py", line 303, in __getitem__
return qs._result_cache[0]
IndexError: list index out of range
Вот как выглядят данные:
Данные о ценах: (заголовок включен в файл csv)
com_des, cpt
"desc 1", '57647'
"desc 2", '87654'
Служебные данные: (заголовок включен в файл)
desc_us, cpt, price
"desc1....", '57647', '89.95'
"dsc2.....", '87654', '875.87'
Вот models.py
Цена
class Price(models.Model):
com_desc = models.CharField(max_length = 200, blank = True, null = True)
service = models.ForeignKey("Service", on_delete=models.SET_NULL, null=True)
Обслуживание
class Service(models.Model):
desc_us = models.TextField(blank=True, primary_key = True)
cpt = models.IntegerField(default= 10000)
Комментарии:
1. Подождите, вы противоречите сами себе. Вы сказали,
cpt
это внешний ключ от Price к Service, но тогда вы ищете целочисленное поле в Service, а не внешний ключ. Что это?2. сервис — это внешний ключ для ценового класса. Я пытаюсь объединить наборы данных в ‘cpt’, поэтому я устанавливаю Price.service в cpt и пытаюсь сопоставить его с Service.cpt
3. Ну, я все еще не совсем понимаю, но неважно. Вы действительно создали объекты сервиса? Что происходит, когда вы это делаете
Service.objects.get(cpt=57647)
?4. Я могу выполнять поиск элементов в сервисе с помощью filter, service = Service.objects.filter(cpt= 87654)[0] выдает мне объект service.
Ответ №1:
Ваше Service.cpt
является целочисленным полем, поэтому оно никогда не будет соответствовать строке. Вместо этого для фильтрации вам следует преобразовать row['cpt']
в целое число:
service=Service.objects.filter(cpt=int(row['cpt']))[0])
Комментарии:
1. Спасибо! Это все еще не работает. Я получаю ту же ошибку
2. Интересно, проблема в заголовке?
3. Я понимаю. Как служебные данные в CSV-файле загружаются в
Service
модель?4. Таким же образом, и он нормально загрузился с CSV. Я могу выполнять поиск элементов в Service с помощью CSV с помощью filter, service = Service.objects.filter(cpt= 87654)[0] выдает мне объект service
5. Но, когда я пытаюсь использовать приведенный выше код, я получаю ошибку «индекс списка вне диапазона»