Django_Relation(Like)


Relation


Likeの実装

  • 複数のプレイヤーは1つのArticleに対していいねをすることができ、1つのプレイヤーは複数のArticleに対していいねをすることができる.
  • モデルの構成

    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()
  • エラーの原因
  • ユーザは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()を使用すると、逆参照が重なるという問題が発生します.
  • したがって、1つのフィールドにrelated nameを設定して問題を解決する必要があります.一般的にM:N関係モデルで設定します.

    モデルの変更

    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()

    現在のユーザーから地域で使用可能な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'),
    ]
    

    ビューの作成

    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')

    ビュー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を返します.
  • を返します.
  • は、特に、大規模なQuery Setコンテキストにおいて特定のオブジェクトを検索する検索
  • に適用される.
  • は、PKなどの一意のフィールドを有するモデルがQuerySetメンバーであるかどうかを調べる最も有効な方法
  • である.
  • QuerySetはin演算子よりも有効です.
  • ボタンを作成

    <form action="{% url 'articles:likes' article.pk %}" method='POST'>
        {% csrf_token %}
        <input type="submit">
    </form>

    サーバーの実行



    ユーザーを
  • で選択する問題が発生しました
  • ArticleForm制御排除
  •     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>

    注文してテーブル