django 11. 관계 필드

dev-somi·2022년 1월 20일
0

django

목록 보기
10/13

RDBMS에서의 관계 예시

1:N 관계 -> models.ForeignKey

  • 한명의 유저가 쓰는 다수의 포스팅/댓글
  • 1개의 포스팅에 다수의 댓글
  • N측에 명시

class Comment(models.Model):
post = models.ForeignKey(Post,
on_delete=models.CASCADE)
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
pass

ForeignKey(대상모델 인자, Record 삭제 시의 규칙 인자)
즉 위의 코드에서 모델은 앞서 생성했던 Post 모델과 comment와의 1:N의 관계를 나타낸다.
CASCADE는 post가 삭제될 때 외래키로 참조된 다른 모델들도 모두 삭제가 된다는 의미이다.

1:1 관계 -> models.OneToOneField

1명의 유저는 1개의 프로필

M:N의 관계 -> models.ManyToManyField

1개의 포스팅에는 다수의 태그
1개의 태그에는 다수의 포스팅

올바른 유저 모델 지정

  • settings.py에 아래 코드 등록

    AUTH_USER_MODEL = 'instagram.User'
    #유저 모델 설정: 앱이름/모델이름

  • models.py에서 원하는 클래스에 아래 코드 등록

    from django.conf import settings
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

User Profile 만들기

  1. startapp 명령을 통해서 accounts 계정 생성

  2. settings.py에 생성한 accounts 앱을 등록함

  3. models에서 DB 생성

    from django.conf import settings
    class Profile(models.Model): # 1대 1의 관계
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    address = models.CharField(max_length = 100)
    zipcode = models.CharField(max_length = 6)

Profile이라는 모델에 user, address, zipcode 네임을 준다.

  1. admin에 등록

    @admin.register(Profile)
    class ProfilleAdmin(admin.ModelAdmin):
    pass

  2. makemigrations와 migrate 명령

그럼 위와 같이 admin에 profile DB가 생성이 된다.

주피터 상에서 위와 같은 코드를 통해서 모델에 연동하고 데이터를 볼 수 있음

Tag 필드 생성 (Many To Many 관계)

  1. models.py에 tag class를 생성한다.

class Tag(models.Model):
name = models.CharField(max_length=50, unique=True) # 해당 태그에서 이름은 하나가 생성이 되면 태그 테이블 내에서 유니크하도록 보장 받아야해서
post_set = models.ManyToManyField(Post)
def str(self):
return self.name

  1. Post class에서 tag 등록

    class Post(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) # 장고는 유저 모델이 변경될 수 있다.
    message = models.TextField()
    photo = models.ImageField(blank=True, upload_to='instagram/post/%Y%m')
    tag_set = models.ManyToManyField('Tag', blank=True) # 태그를 작성하지 않아도 허용하기 때문에 blank 옵션 넣어줌
    is_public = models.BooleanField(default=False, verbose_name='공개여부')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    이때 'Tag'라고 넣은 이유는 tag class는 post class보다 밑에 있기 때문에 읽을 수가 없다. 따라서 '' 안에 넣음. 전체 문서에서 찾는다는 의미이다.

그러면 위와 같이 3개의 model이 생성이 된다.

tag가 반영된 화면이다.

0개의 댓글