Instagram clone - Model 설계 및 Query-set로 검증

Joey Lee·2020년 5월 19일
2

Django

목록 보기
7/23

1. 모델 요구사항 분석하기

  • 회원은 이름(id), 이메일, 패스워드, 팔로우를 가진다.
  • 회원은 다른 회원을 팔로우 할 수 있다.
  • 회원은 피드를 작성할 수 있다.
  • 피드는 텍스트, 사진, 좋아요를 가진다.
  • 회원은 피드를 '좋아요' 할 수 있다.
  • 회원은 피드에 '코멘트'를 남길 수 있다.
  • 코멘트는 텍스트를 가진다.
  • 회원은 본인은 팔로우하는 피드를 메인화면에서 볼 수 있다.

2. 개체(Entity)와 속성(Attribute) 추출하기

3. 개체(Entity)간의 관계 추출하기

4. Model

1) Account App

from django.db import models

class Account(models.Model):
    name = models.CharField(max_length=50, unique=True)     
    email = models.CharField(max_length=50, unique=True)    
    password = models.CharField(max_length=300)          # sqlite3에서는 글자 수 초과해도 되지만, MySQL에서는 초과하면 에러가 남.
    follows = models.ManyToManyField('self', through='Follow', symmetrical=False)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    def __str__(self):
        return self.name
    
    class Meta:
        db_table = 'users'


class Follow(models.Model):
    from_user = models.ForeignKey(Account, on_delete=models.SET_NULL, null=True, related_name='from_user')
    to_user = models.ForeignKey(Account, on_delete=models.SET_NULL, null=True, related_name='to_user')

    class Meta:
        db_table = 'follow'

2) Feed App

from django.db import models

from account.models import Account

class Feed(models.Model):
    account = models.ForeignKey(Account, on_delete=models.SET_NULL, null=True)  # account_id 값이 리턴됨
    content = models.TextField()
    likes = models.ManyToManyField(Account, related_name='likes', through= 'Like')  # Account으로도 테이블 생성, but 그 일을 Like에 위임
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

    class Meta:
        db_table = 'feeds'

class Photo(models.Model):
    feed = models.ForeignKey(Feed, on_delete=models.SET_NULL, null = True)  # feed_id 값이 리턴됨
    image_url = models.URLField(max_length=2000)

    class Meta:
        db_table = 'photos'


class Comment(models.Model):
    feed = models.ForeignKey(Feed, on_delete=models.SET_NULL, null = True)
    account = models.ForeignKey(Account, on_delete=models.SET_NULL, null = True)
    content = models.CharField(max_length=1000)
    created_at = models.DateTimeField(auto_now_add = True)
    
    class Meta:
        db_table = 'comments'

class Like(models.Model):     # 다대다 관계. 별도의 중간 테이블을 생성함. 피드에 대한 Likes임.
    account = models.ForeignKey(Account, on_delete=models.SET_NULL, null = True)
    feed = models.ForeignKey(Feed, on_delete=models.SET_NULL, null = True)

    class Meta:
        db_table = 'likes'

5. Shell Query로 모델 검증

1) Account 객체 생성 후 Follow 관계 맺기

* a = Account.objects.create(name=‘joey’, email=‘joey@joey.com’, password=1234)   
# Joey 객체 생성, 이렇게 여러 개의 객체를 생성함.

* a.follows.add(Account.objects.get(id=3)
# Joey 객체가 id=3를 follow 하도록 함.

* a.follows.all()   
# a가 follow하는 모든 객체를 query-set으로 전달 
<QuerySet [<Account: hey>]>

* a.follows.values()    
# a가 follow하는 객체들의 값을 query-set으로 전달
* <QuerySet [{'id': 3, 'name': 'hey', 'email': 'hey@hey.com', 'password': '1234', 'created_at': datetime.datetime(2020, 5, 14, 13, 40, 43, 195953, tzinfo=<UTC>), 'updated_at': datetime.datetime(2020, 5, 14, 13, 40, 43, 196000, tzinfo=<UTC>)}]>

* a.follows.filter(id=3)   
# a가 follow하는 객체 중 id=3인 객체를 query-set 리턴 <QuerySet [<Account: hey>]>
* a.follows.filter(to_user=1)  
# a가 follow하는 객체 중 to_user=1를 충족하는 query-set 리턴

* a.follows.get(id=3)         
# a가 follow하는 객체 중 id=3인 객체를 리턴
<Account: hey>
* a.follows.count()            
# a가 follow하는 객체의 숫자를 리턴 => 1
* a.follows.first()               
# a가 follow하는 첫번째 객체를 리턴
<Account: hey>
* a.follows.first().id           
# a가 follow하는 첫번째 객체의 id를 리턴 => 3
* a.follows.first().name     
# a가 follow하는 첫번째 객체의 name를 리턴 =>  ‘hey'
* a.follows.first().email     
# a가 follow하는 첫번째 객체의 email를 리턴 => ‘hey@hey.com’

2) Follow 객체 가지고 놀기

2-1) Follow 객체 정보 확인 하기

* Follow.objects.all()
* Follow.objects.values()
* Follow.objects.filter(from_user=1)

2-2) Follow 객체 생성하기 (Follow 객체 통해서)

Follow 객체의 from_user, to_user는 ForeignKey를 가지기에 변수명 끝에 _id가 자동으로 생성되어, from_user_id, to_user_id로 자동 저장됨.

* Follow.objects.create(from_user=3, to_user=2)   => 오류 발생!!
* Follow.objects.create(from_user_id=3, to_user_id=2) => 실행됨!

3) Feed 객체 생성 및 가지고 놀기

Follow와 마찬가지로 Feed의 ForeignKey 값인 account는 자동으로 _id가 붙기 때문에 Shell에서 활용할 때는 account_id로 써야 함.

좋아요 추가할 때는 add, 삭제할 때는 remove 메소드를 쓰면 됨.

* f = Feed.objects.create(account_id=2, content=‘dojun love his dad’)
#2번 사용자가 ‘~~~’ 컨텐츠가 담긴 피드를 생성한다.
* f.likes.add(Account.objects.get(id=1))      
# ㅋㅋ 내가 도준이 feed 좋아함. 
* f.likes.add(Account.objects.get(id=3))      
# hey도 요 feed 좋아함
* f.likes.values()  
# 엥 왜 이렇게 많은 값들이 보이지.. 뭐가 잘못 된 것 같은데
* f.likes.remove(Account.objects.get(id=3))

3) Comment 객체 생성 및 가지고 놀기

Comment는 ForeignKey 값이 feed, account이므로, 자동으로 끝에 _id가 붙임

* g = Comment.objects.create(feed_id=1, account_id=1, content="I love your feed.")
# 피드 1번에 대해 사용자 1번에 ‘~~~~~’라는 컨텐트의 코멘트를 남긴다.
profile
안녕하세요!

0개의 댓글