[TIL] 내일배움캠프 45일차_[Django] Model Relationship
👀Today I Learn
1:1 관계 (One-to-One Relationship)
- 1:1 관계는 한 모델의 인스턴스가 다른 모델의 인스턴스와 정확히 하나의 관계를 맺는 경우
- ex. 한 사람당 하나의 프로필을 가질 때
OneToOneField
를 사용하여 구현.
예시 : 마일스톤(Milestone)
-
account/models.py
from django.db import models from django.contrib.auth.models import AbstractUser from articles.models import Post class Users(AbstractUser) : pass class UserMilestone(models.Model): user = models.OneToOneField('Users', on_delete=models.CASCADE, related_name='milestone') join_anniversary = models.DateField(auto_now_add=True) # 가입한 날 def write_posts_count(self): # Post 테이블에서 해당 사용자의 게시물 수를 계산 return Post.objects.filter(author=self.user).count() # Admin 페이지에서 보여줄 컬럼 이름 설정 write_posts_count.short_description = 'Post Count'
-
account/admin.py
from django.contrib import admin from .models import * @admin.register(Users) class UsersAdmin(admin.ModelAdmin): list_display = ("username",) @admin.register(UserMilestone) class UserMilestoneAdmin(admin.ModelAdmin): list_display = ('user', 'write_posts_count', 'join_anniversary',)
-
User의 고유 Milestone 생성
1:N 관계 (One-to-Many Relationship)
- 1:N 관계는 한 모델의 인스턴스가 다른 모델의 여러 인스턴스와 관계를 맺는 경우
- ex. 하나의 게시글에 여러 개의 댓글이 달릴 때
ForeignKey
를 사용하여 구현
예시 : 카테고리
-
articles/models.py
from django.db import models from django.conf import settings class Post(models.Model): author = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE) title = models.CharField(max_length=18) message = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) category = models.ForeignKey('Category', related_name='posts', on_delete=models.CASCADE, null=True) def __str__(self): return self.title class Category(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name
-
articles/admin.py
@admin.register(Post) class PostAdmin(admin.ModelAdmin): list_display = ("title", "author", "category") @admin.register(Category) class Category(admin.ModelAdmin) : list_display = ('name',)
-
카테고리가 적용된 Post 리스트
N:M 관계 (Many-to-Many Relationship)
- N:M 관계는 여러 모델 인스턴스가 서로 다수의 관계를 맺는 경우(1:N, N:1 관계를 가짐)
- ex. 여러명의 유저가 좋아요를 누르는 경우, 유저는 여러 글에 좋아요를 남길 수 있음
ForeignKey
가 여러개 있는 구조!ManyToManyField
를 사용하여 구현.
예시: 사용자의 관심사
-
account/models.py
class Users(AbstractUser) : interests = models.ManyToManyField('UserInterest', related_name='users') class UserInterest(models.Model): name = models.CharField(max_length=100) def __str__(self): return self.name
-
account/admin.py
@admin.register(Users) class UsersAdmin(admin.ModelAdmin): list_display = ('username', 'show_interest') def show_interest(self, obj): return ", ".join([interest.name for interest in obj.interests.all()]) @admin.register(UserInterest) class UserInterestAdmin(admin.ModelAdmin) : pass
-
사용자의 관심사
💡Today I Thought
오늘의 체크리스트
- 알고리즘 코드카타 121-130
- SQL 코드카타 64
- 백준 코딩테스트 1문제
- 장고 강의
25강까지23강까지 - 스탠다드반 과제
- TIL 작성
회고
생각보다 스탠다드반 과제가 어려워서 강의를 많이 못들었다. 주말에 마저 들어야지.. 빨리 심화도 들어야하는데, 너무 진도가 안나간다.. 엉엉..🥹
댓글남기기