【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 파일은 다음과 같습니다.
  • Category.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에 레코드를 추가하는 방법

    좋은 웹페이지 즐겨찾기