Как создать настраиваемую конечную точку для поля модели в Django? - PullRequest
0 голосов
/ 26 мая 2020

Я хочу иметь конечную точку для каждого изображения, в которое я хочу добавить теги.

Предположим, у меня есть:

#models.py
class ImageTag(models.Model):
    name = models.CharField()
    description = models.CharField()

class Image(models.Model):
    image_id = models.CharField(unique=True)
    image_tags = models.ManyToManyField(ImageTag, blank=True)
    ...

#serializers.py
class ImageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Image
        fields = '__all__'

#views.py
class ImageViewSet(viewsets.ModelViewSet):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    lookup_field = 'image_id'
    ...

#urls.py
router.register(r'images', ImageViewSet, basename='image')

Я хочу POST и DELETE image_tags в конечной точке, например :

localhost:8000/my_app/images/IMG_123/image_tags

где: IMG_123 - это изображение

Думаю, для этого мне понадобится отдельный сериализатор и набор просмотра. Но, что более важно, я хочу знать, как добавить такую ​​конечную точку в router в urls.py

Я ищу что-то вроде этого:

router.register(r'<image>/image_tags', ImageTagViewSet, basename='image_tag')

ПРИМЕЧАНИЕ: я смог чтобы изменить конечную точку изображения, используя его image_id (вместо ID) из-за lookup_field в ImageViewSet, таким образом, может быть:

localhost:8000/my_app/images/IMG_123/

Ответы [ 2 ]

1 голос
/ 26 мая 2020

вы можете создать настраиваемую конечную точку для набора просмотра с определением дополнительных действий вы создадите метод с action декоратором, и маршрутизатор этого набора создаст для вас URL-адрес из этого имени метода, например:

from rest_framework.decorators import action

class ImageViewSet(viewsets.ModelViewSet):
    queryset = Image.objects.all()
    serializer_class = ImageSerializer
    lookup_field = 'image_id'

    @action(detail=True, methods=['post'])
    def image_tags(self, request, *args, **kwargs):
        image_instance = self.get_object() # image that it's id has been passed by url
        # you can now filter and get your ImageTags and serialize it with a serializer


это создаст конечную точку, как вы хотите localhost:8000/my_app/images/IMG_123/image_tags/

1 голос
/ 26 мая 2020

views.py

class ImageViewSet(viewsets.ModelViewSet):
    image_id = self.kwargs['id']
    queryset = Image.objects.get(image_id=image_id)
    serializer_class = ImageSerializer
    lookup_field = 'image_id'
...

urls.py

router.register(r'(?P<id>[a-zA-Z0-9_]+)/image_tags$', ImageTagViewSet, basename='image_tag')
...