【Django】ForeiginKey형의 데이터를 CSV로부터 임포트 하려고 할 때 나온 에러
소개
장고를 사용하여 술 EC 사이트를 만들고 있습니다.
상품의 데이터를 CSV로 가져오려고 할 때 에러와 싸웠기 때문에, 그 때 조사한 해결책을 쓴 기사가 됩니다.
장고2
PostgreSQL
하고 싶었던 일
가져오기 전에 두 개의 테이블을 만들었습니다.
하나는 상품의 분류를 하는 Category 테이블. 또 하나는 상품 정보의 Product 테이블.
models.py
#Metaタグなどは省略
class Category(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
image = models.ImageField(upload_to='category', blank=True)
class Product(models.Model):
name = models.CharField(max_length=250, unique=True)
slug = models.SlugField(max_length=250, unique=True)
description = models.TextField(blank=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)#★今回問題のやつ★
price = models.IntegerField()
image = models.ImageField(upload_to='product', blank=True)
stock = models.IntegerField()
available = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True, null=True)
가져올 CSV 파일은 다음과 같습니다.
2. Product.csv
이 CSV 파일을 가져와 테이블에 넣는 것이 목표
나온 오류
우선 Category.csv를 가져왔다.
practice_db=> \copy shop_product (name,slug,description,image) FROM 'path/to/Category.csv' (DELIMITER ',', FORMAT CSV, ENCODING 'UTF8', HEADER);
COPY 3 #正常にインポート
그런 다음 Product.csv를 가져 오려고하면 오류가 발생했습니다.
practice_db=> \copy shop_product (name,slug,description,category,price,image,stock,available,created) FROM 'path/to/Product.csv' (DELIMITER ',', FORMAT CSV, ENCODING 'UTF8', HEADER);
ERROR:リレーション"shop_product"の列"category"は存在しません
해결 방법
오류가 발생했을 때 가져오려고 했던 Product.csv의 category 데이터에는 Category.csv의 name 값이 들어 있다.
이것을 name의 값으로 지정하는 것이 아니라, Category의 id로 지정하지 않으면 에러가 나온다.
또한 열 이름을 category가 아닌 category_id로 변경합니다.
변경 후 Product.csv 파일은 다음과 같습니다.
아무래도, ForeiginKey형의 데이터에는 id가 들어가는 정답인 것 같다.
잘 생각하면 Category의 name이 아니라 절대 중복되지 않는 id로 지정해야 한다고 생각했다.
참고 사이트
장고에서 csv 파일을 업로드하고 DB에 레코드를 추가하는 방법
Reference
이 문제에 관하여(【Django】ForeiginKey형의 데이터를 CSV로부터 임포트 하려고 할 때 나온 에러), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/mamorous3578/items/037ff4320c8fc1d0cd96텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)