파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 강의를 듣고 정리한 글입니다.
django.db.models.ForeignKey
to
: 대상 모델을 지정 (클래스명 또는 클래스 명을 문자열로 지정한다.on_delete
: Record 삭제 시 룰이다.# models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
class Comment(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
message = models.TextField()
# 정방향 접근 (N -> 1)
$ Comment.objects.first()
$ comment.post # = Post.objects.get(pk=comment.post_id)
# 역방향 접근 (1 -> N)
$ post = Post.objects.first()
# 아래는 역방향 접근 방법으로 전부 같은 동작을 한다.
$ Comment.objects.filter(post_id=4)
$ Comment.objects.filter(post__id=4)
$ Comment.objects.filter(post=post)
$ post.comment_set.all() # reverse_name=comment_set
모델명소문자_set
이다.ForeignKey
필드에 related_name 속성에서 reverse_name을 지정해줄 수 있다. ( ex. "blog_post_set")ForeignKey
필드에 reverse_name로 "+"를 넘긴다.class Comment(models.Model):
post = models.ForeignKey(to='instagram.Post', on_delete=models.CASCADE,
limit_choices_to={'is_publish': True})
django.db.models.OneToOneField
profile.user_set.first()
→ userprofile.user
→ userdjango.db.models.ManyToManyField
ManyToManyField(to, blank=Falase)
class Post(models.Model):
# ...
tag_set = models.ManyToManyField('instagram.Tag', blank=True) # 활용하는 쪽(Post에서 Tag를 활용)에서 지정할 때
# ...
class Tag(models.Model):
name = models.CharField(max_length=50, unique=True)
# post_set = models.ManyToManyField('Post', blank=True) # 활용되는 쪽에서 지정할 때
def __str__(self):
return self.name
# 포스트에 하나의 태그를 추가하기
tag = Tag.objects.get(name='장고')
post.tag_set.add(tag)
# 포스트에 여러개의 태그를 추가하기
tag_qs = Tag.objects.all()
post.tag_set.add(*tag_qs)
post.tag_set.all()