ERD 작성할때 mysql에서 테이블 칼럽을 조회하면 더 자세한 정보들을 알 수있어 참고하기 좋았다!
class BaseModel(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Profile(BaseModel):
user = models.OneToOneField(User, on_delete=models.CASCADE)
nickname = models.CharField(max_length=40, unique=True)
introduction = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to="image")
def __str__(self):
return self.nickname
class Post(BaseModel):
author = models.ForeignKey(Profile, on_delete=models.CASCADE)
title = models.CharField(max_length=100, null=True)
content = models.TextField(null=True, blank=True)
def __str__(self):
return '{} : {}'.format(self.author, self.title)
class File(BaseModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
content = models.FileField(upload_to="file") #media/file/ 아래에 저장
class Comment(BaseModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
writer = models.ForeignKey(Profile, on_delete=models.CASCADE)
content = models.TextField(blank=False)
def __str__(self):
return '{} commented {} post'.format(self.writer, self.post.title)
class Follow(BaseModel):
follower = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='follower')
following = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='following')
def __str__(self):
return '{} -> {}'.format(self.follower.nickname, self.following.nickname)
related_named은 역참조할때 사용된다. Follow객체를 정의할 때, follower와 following이라는 속성에 Profile 객체가 연결되어 정참조하고 있다. Profile 객체의 인스턴스와 연결되어 있는 Follow 객체를 거꾸로 불러올 때, follower와 following이라는 이름으로 부르기 위해 follower와 following이라는 속성에 related_names = 'follower', related_names = 'following'을 함께 지정해주었다. 나중에 역참조 할때 follower_set, following_set이런식으로 사용하면 된다!
class Like(BaseModel):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
user = models.ForeignKey(Profile, on_delete=models.CASCADE)
def __str__(self):
return '{} liked {}'.format(self.user.nickname, self.post.title)
> python manage.py makemigrations <app-name>
: <app-name>/model.py
를 바탕으로 마이그레이션 파일 생성 > python manage.py migrate
: model 변경 사항을 db에 업데이트 해주는 과정>>> from api.models import User, Profile, Post, Comment
>>> Profile.objects.create(user_id =2, nickname ='chaeri', introduction = 'heyyyyyyy')
<Profile: chaeri>
>>> User.objects.create(username='김초코',password='1111')
<User: 김초코>
>>> Profile.objects.create(user_id =3, nickname ='choco', introduction = '멍멍')
<Profile: choco>
>>> User.objects.create(username='세오스',password='2222')
<User: 세오스>
>>> Profile.objects.create(user_id =4, nickname ='ceos', introduction = '후후')
<Profile: ceos>
>>> Profile.objects.all()
<QuerySet [<Profile: chaeri>, <Profile: choco>, <Profile: ceos>]>
확인해 보니 프로필도 유저도 잘생성된다:):)뿌듯하다!
>>> user1 = Profile.objects.get(nickname='chaeri')
>>> Post.objects.create(author=user1, title='first',content = '신기하다', like_num = 2)
<Post: first>
>>> Post.objects.create(author=user1, title='second',content = '모델링 어렵다....ㅠ', like_num = 4)
<Post: second>
>>> user2 = Profile.objects.get(nickname='choco')
>>> Post.objects.create(author=user2, title='배고파',content = '간식 줘', like_num = 5)
<Post: 배고파>
>>> Post.objects.filter(title='first') # 필터 함수 적용해보기
<QuerySet [<Post: first>]>
포스트도 잘생성되는것 같다!최고~~~