間違いがあるかもです。修正点は教えていただくと幸いです。
使用しているライブラリのバージョン
- 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__"
こうすることによって、フィールドが動的に作られ、渡される。