Django Taggit 사용법
Posted on 2021-08-30 by GKSRUDTN99
Django Rest Framework
DRF
Taggit
Django 서비스에 쉽게 태그를 할 수 있도록 도와주는 앱이다.
설치방법 및 설정방법
추후에 추가!
Django Taggit을 Serializer에서 활용하는 방법
import taggit.serializers import TaggitSerializer, TagListSerializerField
Serializer가
TaggitSerializer
도 extend하도록 설정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/