backend django 정참조 데이터 가져오기

eunji hwang·2020년 4월 16일
0

BACKEND-PYTHON-DJANGO

목록 보기
16/28

정참조

Foreign Key를 갖는 테이블, 바라보는 테이블의 데이터를 가져올 수 있다.

예제 DB 구조

# 유저목록 테이블, 사용자이름과 비밀번호 저장한다.
class User(models.Model):
    # PK, unique, AI 자동생성
    # 직접 지정 : id = models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)
    user_name   = models.CharField(max_length=50)
    password    = models.CharField(max_length=200)
    # 지금 User테이블에서 userprofile이 역참조 되고 있다. 사용하기 불편쓰!!..
    # User가 Userprofile을 정참조하는것이 데이터 접근 이 용이하다.. 코드도 쉽공
    class Meta:
        db_table = 'users'

# 유저의 사진과, 자기소개 글이 등록된 테이블 유저테이블의 1:1관계
class UserProfile(models.Model):
    user        = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_uniq_id')
    # ! related_name은 역참조시 사용, 지정하지 않으면 기본 역참조는 테이블명소문자_set으로 역참조를 찾아간다.
    image_url   = models.CharField(max_length=300, null=True)
    description = models.CharField(max_length=100, null=True)

    class Meta:
        db_table = 'user_profile'

# 인스타그램 피드 테이블, 유저의 이름, 프로필사진, 댓글 정보를 외부에서 가져와야 한다.
class Feed(models.Model):
    user         = models.ForeignKey('account.User', on_delete = models.CASCADE, related_name = 'author')
                   # ? user, user_profile이 1:1일때 굳이 user_profile컬럼을 추가할 필요없다..! 
                   # user_profile = models.ForeignKey('account.UserProfile', on_delete = models.SET_NULL, null = True, related_name = 'avatar')
    image_url    = models.CharField(max_length = 300, verbose_name = 'image')
    content      = models.TextField(verbose_name = 'content')
    like         = models.IntegerField(verbose_name = 'likes', null = True)
    comment      = models.ManyToManyField('Comment', through = 'FeedComment', related_name = 'feed_comment')
    feed         = models.ManyToManyField('Feed', through = 'FeedComment', related_name = 'comment_feed')

    class Meta:
        db_table = 'feeds'

정참조 데이터 얻기

# 내 테이블의 값을 가져오자!
>>> Feed.objects.get(id=1).image_url

# <테이블A>.<테이블A FK인 컬럼A>.<컬럼A가 바라보는 테이블의 컬렴이름>
>>> Feed.user.user_name
blueberry # user_name에 저장된 값이 출력된다.

컬럼명 > 컬럼명을 타고 값을 가져온다

profile
TIL 기록 블로그 :: 문제가 있는 글엔 댓글 부탁드려요!

0개의 댓글