Фильтр REST фильтра django по внешнему ключу lookup_field - PullRequest
0 голосов
/ 04 марта 2019

У меня есть время obj, сериализованное в DRF.

модель:

class Time(TimeStampedModel):
    user = models.ForeignKey(
        'users.User', on_delete=models.CASCADE, related_name='time_logs')
    amount = models.DurationField()
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

сериализатор:

class TimeSerializer(serializers.ModelSerializer):
    user = serializers.HiddenField(default=serializers.CurrentUserDefault())

    class Meta:
        model = Time
        fields = ('__all__')
        extra_kwargs = {'date_created': {'read_only': True}, 'date_updated': {'read_only': True}}

viewset:

class UserTimeViewSet(viewsets.ModelViewSet):
    serializer_class = TimeSerializer
    queryset = Time.objects.all()

    def get_queryset(self):
        return Time.objects.filter(user=self.request.user)

urls

from rest_framework.routers import DefaultRouter

router = DefaultRouter()

router.register(r'users/time', UserTimeViewSet)

это дает мне конечную точку: /users/time/{id} где {id} - идентификатор объекта времени.Когда я попытался изменить конечную точку на тот же URL-маршрут, но вместо этого передал ей идентификатор пользователя в качестве аргумента arg (чтобы получить только время этого пользователя), переписав lookup_field на сериализаторе и ViewSet, я либо получаю ошибку ответа или {"detail":"Not found."}

class UserTimeViewSet(viewsets.ModelViewSet):
    serializer_class = TimeSerializer
    queryset = Time.objects.all().select_related('user')
    lookup_field = 'user'

также пытался:

class UserTimeViewSet(generics.ListAPIView):
    serializer_class = TimeSerializer

    def get_queryset(self):
        user = self.kwargs['user']
        return Time.objects.filter(user=user)

как я могу ПОЛУЧИТЬ ВРЕМЯ с отношением к пользователю по его идентификатору?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Другой ответ JPG - верное решение, если у пользователя есть только один объект Time.однако несколько objs вернут MultipleObjectsReturned get() returned more than one Time err

решение для нескольких objs состояло в том, чтобы преобразовать набор в ListAPIView:

views:

class UserTimeViewSet(generics.ListAPIView):
    serializer_class = TimeSerializer
    queryset = Time.objects.all()

    def get_queryset(self):
        return Time.objects.filter(user=self.kwargs['user'])

urls:

url(r'users/time/(?P<user>\d+)/$', UserTimeViewSet.as_view(), name='user_time'),
0 голосов
/ 04 марта 2019

Если меня правильно поняли, этот класс просмотра сделает магию

class UserTimeViewSet(viewsets.ModelViewSet):
    serializer_class = TimeSerializer
    queryset = Time.objects.all()
    <b>lookup_field = 'user'</b> # add "lookup_field" attribute

    # remove "get_queryset()" method
    <strike>def get_queryset(self):</strike>
        <strike>return Time.objects.filter(user=self.request.user)</strike>
...