Django_Relation(Like)
Relation
Like 구현하기
- 여러 유저가 한 Article에 좋아요를 누를 수 있고, 한 유저가 여러 Article에 좋아요를 누를 수 잇다.
model 구성
class Article(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
like_users = models.ManyToManyField(settings.AUTH_USER_MODEL)
title = models.CharField(max_length=10)
content = models.TextField()
- error 발생 원인
- user와 접근과 like_user의 접근이 겹쳤기 때문
- user : Article이 1:N 관계일 때 참조 역참조를 article.user.all(), user.article_set.all()로 진행할 수 있었다.
- 하지만 이번 like와 진행할 때 고려해보면 User : Article이 M:N관계이다. 그렇다면 참조를 article.like_user.all(), user.article_set.all()로 역참조가 겹치는 문제가 발생한다.
- 따라서 하나의 필드에 relate_name을 설정해줘서 문제를 해결해야한다. 일반적으로 M:N관계 모델에 이를 설정해준다.
model 수정
class Article(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) like_users=models.ManyToManyField(settings.AUTH_USER_MODEL,related_name='like_articles')
title = models.CharField(max_length=10)
content = models.TextField()
현재 User - Article 간 사용 가능한 DB API
-
article.user
- 게시글을 작성한 유저 - 1:N
-
article.like_users
- 게시글을 좋아요 한 유저 - M:N
-
user.article_set
- 유저가 작성한 게시글(역참조) - 1:N
-
user.like_articles
- 유저가 좋아요한 게시글(역참조) - M:N
url 작성
app_name = 'articles'
urlpatterns = [
path('', views.index, name='index'),
path('<int:article_pk/likes/', views.likes, name='likes'),
]
views 작성
def likes(request,article_pk) :
#어떤 객체에 좋아요가 눌렸는지 확인
article = get_object_or_404(Article, pk=article_pk)
#누르는게 무조건 좋아요를 활성화하는 것은 아님 좋아요를 2번 누르면 취소되게 구현할 수 있음
#이 게시글에 좋아요를 누른 유저 목록에 현재 요청하는 유저가 있다면 좋아요 취소
if request.user in article.like_users.all() :
article.like_users.remove(request.user)
#아니면 좋아요
else :
article.like_users.add(request.user)
return redirect('articles:index')
views 작성2
def likes(request,article_pk) :
article = get_object_or_404(Article, pk=article_pk)
if article.like_users.filter(pk=request.user.pk).exists() :
article.like_users.remove(request.user)
else :
article.like_users.add(request.user)
return redirect('articles:index')
QuerySet API - 'exists()'
- QuerySet에 결과가 포함되어 있으면 True를 반환하고 그렇지 않으면 False를 반환
- 특히 규모가 큰 QuerySet의 컨텍스트에서 특정 개체 존재 여부와 관련된 검색에 유용
- 고유한 필드(예 : PK)가 있는 모델이 QuerySet의 구성원인지 여부를 찾는 가장 효율적인 방법
- Queryset이 커졌을 대 in 연산자보다 더 효율적인 효과를 보인다.
좋아요 버튼 만들기
<form action="{% url 'articles:likes' article.pk %}" method='POST'>
{% csrf_token %}
<input type="submit">
</form>
서버 실행
- 좋아요를 누를 유저를 선택할 수 있는 문제가 발생
- ArticleForm에서 exclude를 조정
class Meta :
model = Article
exclude = ('user','like_users',)
- 좋아요 버튼을 추가
<div>
<form action="{% url 'articles:likes' article.pk %}" method='POST'>
{% csrf_token %}
{% if user in article.like_users.all %}
<button class="btn" style="background-color : transparent;">
<i class="fa regular fa-heart" style="color:red"></i>
</button>
{% else %}
<button class="btn" style="background-color : transparent;">
<i class="fa regular fa-heart" style="color:black" ></i>
</button>
{% endif %}
</form>
</div>
좋아요 누른 후 테이블
Author And Source
이 문제에 관하여(Django_Relation(Like)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@holawan/DjangoRelationLike저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)