Сопоставление внешних ключей таблицы django с функцией фильтра

#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. Но, когда я пытаюсь использовать приведенный выше код, я получаю ошибку «индекс списка вне диапазона»