My Image

Django 포스팅

[Django] 다른 APP에서 데이터베이스 Model 가져오기

Doyeon0430 | 2023년 05월 19일

Django 이미지

이번시간에는 models.py에서 외래키를 사용해 다른 app끼리 연결해보겠습니다.

장고는 app마다 model값을 등록하는데 ForeignKey를 사용하면 다른 모델을 참조할 수 있습니다.

추가적으로 @receiver를 이용해 모델이 추가되면 외래키도 자동으로 추가되게 만들겠습니다.

 

  1. Django 앱끼리 연결 - App에서 Model 연결

  2. Django 앱끼리 연결 - post_save로 Model 자동생성

  3. Django 앱끼리 연결 - post_save로 Model 코드설명

 

 

1. Django 앱끼리 연결 - App에서 Model 연결

다른 app에서 models 값을 새로 가져왔습니다.

보통 import를 사용해 views.py에서 가져오는 방법이 있지만

똑같은 데이터에 외래키를 사용하고자 새롭게 입력했습니다.

 

1. Model.py

from movie.models import Movie
from engineer.models import Django

class List_movie(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.movie.subject)
    
class List_django(models.Model):
    django = models.ForeignKey(Django, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.django.subject)

저는 movie앱에 movie모델과 engineer앱에 django모델을 가져왔습니다.

하위 개체에게 ForeignKey를 사용하면 쉽게 앱끼리 연동할 수 있습니다.

 

2. views.py

from django.shortcuts import render
from .models import List_movie, List_django

def home(request):
    movie_content = List_movie.objects.all()
    django_content = List_django.objects.all()
    content = {'movie_content': movie_content,  'django_content':django_content}
    return render(request, 'myprofile/home.html', content)

 

3. HTML

{% for item in movie_content %}

    제목 : {{ item.movie.subject }}
    내용 : {{ item.movie.content }}
     {% for genre in item.movie.genres.all %}
         {{ genre }}
     {% endfor %}

{% endfor %}

moive_content에는 여러개의 값들이 있어서 for문을 사용합니다.

상위 모델에 필드를 가져올 때 "movie.필드값"으로 사용하면 됩니다.

그리고 외래키는 보통 genre_set로 가져오는데

외래키 안에 외래키라는 복잡한 관계를 가지고 있어서 가독성이 떨어집니다.

 

moviesubject = models.ForeignKey(Movie, on_delete=models.CASCADE,  related_name='genres')

그렇게 related_name을 사용하면 역참조를 쉽게 할 수 있습니다.

이로써 ForeignKey로 다른 앱에서 모델을 가져왔습니다.

 

 

2. Django 앱끼리 연결 - post_save로 Model 자동생성

여기서 movie 모델과 engineer 모델에 값이 추가될 때

가져온 app에서는 연동이 안되는 현상이 발생했습니다.

이러한 문제를 해결해보겠습니다.

 

1. Model.py

from django.db.models.signals import post_save
from django.dispatch import receiver

@receiver(post_save, sender=Movie) #참조키 값 생성될 때 자동 생성
def create_list_movie(sender, instance, created, **kwargs):
    if created:
        List_movie.objects.create(movie=instance)

@receiver(post_save, sender=Django) #참조키 값 생성될 때 자동 생성
def create_list_django(sender, instance, created, **kwargs):
    if created:
        List_django.objects.create(django=instance)

@receiver를 이용하면 해당 모델에서 값이 생성될 때

post_save가 신호를 입력받고 가져온 app에서 모델 값을 연동 할 수 있습니다.

참조키로 값이 생성되면 리시브키가 자동으로 입력받아 생성시켜줍니다.

 

 

3. Django 앱끼리 연결 - post_save로 Model 코드설명

@receiver의 코드를 리뷰해보겠습니다.

 

create_list_django안에 많은 변수가 있습니다.

sender : 신호를 보내는 모델 클래스

instance : sender로 온 인스턴스

created : 인스턴스가 생성되면 True

**kwargs : 파이썬에서 함수 정의 시 사용되는 매개변수

댓글 (0)

    댓글이 없습니다.

간편 댓글 작성

My Image My Image My Image My Image