Как получить pk из url в django rest framework?
У меня есть 2 приложения Ticket и Comment, с url: http://127.0.0.1:8000/api/tickets/<int:pk>/comments/<int:pk>/
.
comment.views
class CommentAPIList(ListCreateAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
pagination_class = CommentAPIListPagination
Я хочу получить первый int:pk в моем url для фильтрации моего набора запросов, например:
queryset = Comment.objects.filter(ticket=MY_GOAL_PK)
comment.models
class Comment(models.Model):
text = models.TextField()
ticket = models.ForeignKey(
Ticket,
on_delete=models.CASCADE,
)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.text
ticket.models
class Ticket(models.Model):
title = models.CharField(max_length=150)
text = models.TextField()
status = models.ForeignKey(Status, on_delete=models.PROTECT, default=2)
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.title
<
Вы переопределяете метод get_queryset(…)
:
class CommentAPIList(ListCreateAPIView):
queryset = Comment.objects.all()
serializer_class = CommentSerializer
permission_classes = (IsAuthenticatedOrReadOnly,)
pagination_class = CommentAPIListPagination
def get_queryset(self, *args, **kwargs):
return (
super()
.get_queryset(*args, **kwargs)
.filter(ticket_id=self.kwargs['ticket_pk'])
)
Для пути первичный ключ билета должен иметь другое имя, например:
api/tickets/<int:ticket_pk>/comments/<int:pk>/