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'
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번에 ‘~~~~~’라는 컨텐트의 코멘트를 남긴다.