Django Rest Framework как мне получить id, который я использую в URL
У меня есть этот сериализатор, и я использую его для получения деталей поста, принадлежащего пользователю. Владельцем поста является не тот пользователь, который в данный момент вошел в систему. Я хочу проверить, добавил ли этот пост в закладки пользователь, вошедший в систему в данный момент. id текущего пользователя передается в запросе, но я не могу найти его в этом контексте.
Вот сериализатор:
class UserPostSerializer(serializers.ModelSerializer):
images = PostImageSerializer(many=True, read_only=True, required=False)
profile = serializers.SerializerMethodField()
bookmarked = serializers.SerializerMethodField()
class Meta:
model = Post
fields = [
"id",
"category",
"body",
"images",
"video",
"profile",
"published",
"bookmarked",
"created_at",
"updated_at",
]
depth=1
def get_profile(self, obj):
profile_obj = Profile.objects.get(id=obj.user.profile.id)
profile = ShortProfileSerializer(profile_obj)
return profile.data
def get_bookmarked(self, obj):
breakpoint()
bookmark = Bookmark.objects.filter(owner=obj.user.id, post=obj.id,marktype='post')
if bookmark:
return True
else:
return False
Проблема в том, что obj.user.id является владельцем поста. Мне нужен залогиненный пользователь, чей id передается в url. Вот модель для закладки:
class Bookmark(models.Model):
marktype = models.CharField(max_length=50)
post = models.OneToOneField(Post, on_delete=models.CASCADE, null=True, blank=True)
owner = models.ForeignKey(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="created at")
updated_at = models.DateTimeField(auto_now=True, verbose_name="updated at")
class Meta:
verbose_name = "bookmark"
verbose_name_plural = "bookmarks"
ordering = ["created_at"]
db_table = "bookmarks"
def __str__(self):
return "{}'s bookmark".format(self.owner.username)
и вот URL:
path("posts/<int:user>/home/", HomeView.as_view(), name="home"),
Это self.context['request'].user возвращает владельца поста, а не вошедшего пользователя. Как мне получить id текущего вошедшего пользователя или пользователя, чей id я передаю в URL?
Можно ли использовать фильтры для Viewset
:
urls.py
path("posts/home/", HomeView.as_view(), name="home")
viewsets.py
from rest_framework import viewsets
from .models import Post
from .serializers import, UserPostSerializer
from .filters import OwnerFilter
class HomeView(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = UserPostSerializer
filter_backends = (OwnerFilter,)
filters.py
from rest_framework.filters import BaseFilterBackend
class OwnerFilter(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
owner = request.query_params.get('owner', None)
if not owner:
return queryset.all()
else:
try:
return queryset.filter(bookmarked__owner__id=owner)
except Exception:
return queryset.none()
Выполняется
Затем откройте URL: /posts/home/?owner=OWNER_ID_HERE
Решил эту проблему, и вы можете получать любые kwargs из представления, которое обрабатывает запрос. В моем случае добавление следующего в функцию get_bookmarked дает мне id, который я отправляю в URL:
loggeduser = self.context.get('view').kwargs.get('user')