Django Taggit 사용법

Posted on 2021-08-30 by GKSRUDTN99
Django Rest Framework DRF Taggit

Django 서비스에 쉽게 태그를 할 수 있도록 도와주는 앱이다.


설치방법 및 설정방법

추후에 추가!


Django Taggit을 Serializer에서 활용하는 방법

  1. import taggit.serializers import TaggitSerializer, TagListSerializerField

  2. Serializer가 TaggitSerializer도 extend하도록 설정

  3. taggit을 사용하는 필드를 TagListSerializerField로 지정한다.

import taggit.serializers import TaggitSerializer, TagListSerializerField
...
class StylistSerializer(TaggitSerializer, serializers.ModelSerializer):
    preferable_styling_tags = TagListSerializerField()

    class Meta:
        ...

Serializer로 레코드 생성

Request를 Json 형식으로 보낼 때, Taggit 필드는 리스트의 형식으로 작성한다.


Taggit을 사용하는 모델의 Serializer에서 create 오버라이딩 하기

Taggit을 사용할 때, Serializer의 create 함수를 오버라이딩 하면, taggit 필드가 제대로 저장되지 않는 경우가 있는데, 이 경우 다음 코드를 create 함수 내에서 실행하면 된다.

class FeedSerializer(TaggitSerializer, serializers.ModelSerializer):
    feed_images = FeedImageSerializer(many=True, read_only=True)

    styling_tags = TagListSerializerField()

    class Meta:
        model = Feed
        fields = '__all__'
        read_only_fields = ['stylist', ]

    def create(self, validated_data):
        images_data = self.context['request'].FILES
        # 이 부분을 추가한다!
        to_be_tagged, validated_data = self._pop_tags(validated_data)
        tag_object = super(TaggitSerializer, self).create(validated_data)
        feed = self._save_tags(tag_object, to_be_tagged)
        # 여기까지!
        for image_data in images_data.getlist('feed_image'):
            FeedImage.objects.create(feed=feed, image=image_data)

        return feed

Django Tag 이름으로 필터링하기

filter(tags__name__in=['1','2']).distinct()로 tag 필드에 1 또는 2가 포함된 레코드들을 필터링 할 수 있다. 사용예시

class FeedViewSet(viewsets.ModelViewSet):
    (... 생략 ...)
    def list(self, request, *args, **kwargs):
        feeds = self.filter_queryset(self.queryset)
        if request.data.get('tags', None) is not None:
            tags = request.data.get('tags')
            feeds = feeds.filter(styling_tags__name__in=tags).distinct()
        (... 생략 ...)

참고 웹

https://subeen.io/blog/devs/2021-05-09-django-taggit/