django legacy 데이터 모델관계 정의 질문 입니다.

조회수 1290회

안녕하세요. 여배우들이 출연한 영화 목록을 보여주는 웹앱을 만들고 있습니다. 그래서 일단 scrapy로 데이터는 다운을 받고 DB에 저장을 해놓았습니다.

아래는 장고 모델 입니다.


class MovieList(models.Model):
    release_date = models.CharField(max_length=30)
    running_time = models.CharField(max_length=10)
    name = models.CharField(max_length=200)
    company = models.CharField(max_length=30)
    number = models.CharField(max_length=30)


class Actressimages(models.Model):
    name = models.CharField(null=True)
    image_urls = models.CharField(max_length=200)
    images = models.TextField()
    image_paths = models.TextField(null=True)


저 모델대로 여배우 목록을 만들고 출연영화를 보여줄 계획인데요 이 부분에서 부터 막혔습니다.

그래서 다대다로 모델필드를 아래와 같이 수정했습니다.


class MovieList(models.Model):
    release_date = models.CharField(max_length=30)
    running_time = models.CharField(max_length=10)
    name = models.CharField(max_length=200)
    company = models.CharField(max_length=30)
    number = models.CharField(max_length=30)


class Actressimages(models.Model):
    name = models.ManyToMany(MovieList)
    image_urls = models.CharField(max_length=200)
    images = models.TextField()
    image_paths = models.TextField(null=True)


위 처럼 Actressimages 클래스의 name을 다대다로 지정하면 되지 않을까싶어 막상 저렇게 해놓고 보니 legacy 데이터를 name 변수에 어떻게 매칭을 시켜야 할텐데 그 방법을 알수가 없습니다.

질문,

legacy 데이터를 다대다 관계의 모델에 집어넣으려면(?) 어떻게 해야 하나요? 아니면 위의 두 모델로 저장되어 있는 데이터를 어떻게 하면 제가 원하는 대로(여배우 이름별로 정렬 후 이름을 클릭하면 출연작이 나옴) 템플릿에서 display 할 수 있을까요?

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • Django에서 모델은 기본적으로 surrogate key를 primary key로 씁니다. 모델에는 정의도지 않았지만, "id"라는 필드가 이미 존재함으로 그를 통해서 관계를 정리한다고 생각하시면 됩니다.

    따라서 다음과 같이 정의하시는 것이 더 낳을것 같습니다.

    class MovieList(models.Model):
        release_date = models.CharField(max_length=30)
        running_time = models.CharField(max_length=10)
        name = models.CharField(max_length=200)
        company = models.CharField(max_length=30)
        number = models.CharField(max_length=30)
    
    class Actressimages(models.Model):
        name = models.CharField(null=True)
        image_urls = models.CharField(max_length=200)
        images = models.TextField()
        image_paths = models.TextField(null=True)
        movies = models.ManyToMany(MovieList)
    

    추가답변

    N:N 관계를 저장하시려면 다음 예를 참고하세요.

    우선 다음과 같은 영화들을이 있을 때,

    >>> m1 = new MovieList(name='영화제목', release_date=...)
    >>> m1.save()
    >>> m2 = new MovieList(name='다른영화', release_date=...)
    >>> m2.save()
    

    배우 A씨와 A씨가 참여한 영화는 다음과 같이 하시면 될 것 같습니다.

    >>> act1 = new Actressimages(name="A씨",images='...',...)
    >>> act1.save()  
    

    위와 같이 먼저 저장부터 해주세요.

    >>> act1.movies.add(m1,m2)
    혹은
    >>> act1.movies.add(m1)
    >>> act1.movies.add(m2)
    

    이렇게 하시면 관계가 저장됩니다.

    다음으로 각 배우가 참여한 영화의 목록은 다음과 같이 하면 됩니다.

    >>> act1.movies.all()
    

    참고: 온라인문서

    주: 네이밍

    MoveList로 표현하려는 것이 영화 정보들의 집합이라면 MovieList보다는 Movie로 객체이름을 정하는것이 좋을것 같습니다. 하나의 레코드에 대한 모델이름을 정하는 것이 좋습니다. 같은 맥락으로 Actressimages보다는 Actress 혹은 ActressImage가 낳을 것 같네요.

    로직과 상관없는 부분으로, 본인이 원하는시는대로 하셔도 됩니다. :)

    • 넵 답변달아주신대로 수정했습니다. 그런데 이렇게 수정하고 난 뒤에 이미 데이터를 보면 movies가 Movielist의 한두가지 오브젝트와 매칭이 되어야 하는데 그것을 못하겠습니다 ㅜㅜ 현재는 Movielist의 전체 오브젝트가 movies필드에 들어있는 상태입니다. 이미 다운받아 DB에 있는 데이터를 이름-작품으로 연결시키려면 어떻게 해야할까요? 알 수 없는 사용자 2016.6.25 13:19
    • 답변을 추가하였습니다. 원하는 답변이었으면 좋겠습니다. 허대영(소프트웨어융합대학) 2016.6.25 13:51

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)