1:N 관계 -> models.ForeignKey
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개의 태그에는 다수의 포스팅
AUTH_USER_MODEL = 'instagram.User'
#유저 모델 설정: 앱이름/모델이름
from django.conf import settings
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
startapp 명령을 통해서 accounts 계정 생성

settings.py에 생성한 accounts 앱을 등록함
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 네임을 준다.
admin에 등록
@admin.register(Profile)
class ProfilleAdmin(admin.ModelAdmin):
pass
makemigrations와 migrate 명령

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

주피터 상에서 위와 같은 코드를 통해서 모델에 연동하고 데이터를 볼 수 있음
class Tag(models.Model):
name = models.CharField(max_length=50, unique=True) # 해당 태그에서 이름은 하나가 생성이 되면 태그 테이블 내에서 유니크하도록 보장 받아야해서
post_set = models.ManyToManyField(Post)
def str(self):
return self.name
이때 'Tag'라고 넣은 이유는 tag class는 post class보다 밑에 있기 때문에 읽을 수가 없다. 따라서 '' 안에 넣음. 전체 문서에서 찾는다는 의미이다.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)

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

tag가 반영된 화면이다.