0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DjangoRestFrameworkで、追加の情報をレスポンスに含める

Posted at

間違いがあるかもです。修正点は教えていただくと幸いです。

:v: 使用しているライブラリのバージョン

  • Django==4.2.3
  • djangorestframework==3.14.0
  • djangorestframework-api-key==2.3.0

したいこと

modelに記述されていない、追加の情報をquerysetに含めたい。

DRF(Django Rest Framework)を使わないとき

viws.pyにこのように書くだけで実現できる

views.py
class userView(ListView):
    template_name = "notes.html"
    # 一回で読み込む量
    paginate_by = 10

    def get_queryset(self):
        username = self.kwargs["user"]
        user = User.objects.get(username=username)
        noteList = (
            Post.objects.filter(user_id=user.id)
            .order_by("-posted_at")
            .annotate(
                is_liked=Exists(
                    likes.objects.filter(
                        likes_note=OuterRef("id"), like_user=self.request.user.id
                    )
                )
            )
        )

.annotateで、is_likedという値を渡すようになっている。
もちろん、テンプレートの渡される!!!

ではDRFを使うと。

DRFの下準備は別の記事を参照ください

レスポンスのJSONにis_likedが含まれなくなっている


{
    "results": [
        {
            "id": 106,
            "note": "改行\r\n改行",
            "posted_at": "2023-08-01T09:03:24.737931+09:00",
            "likes_count": 0,
            "user": 1
        },
        {"//": "以下略"}
        

解決法

serializer.pyにフィールドを追加で書く
serializer.py
    class NoteAPI(serializers.ModelSerializer):
    is_liked = serializers.BooleanField()

    class Meta:
        model = Post
        fields = "__all__"

こうすることによって、フィールドが動的に作られ、渡される。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?