Python 如何用slug代替id过滤对象

Python 如何用slug代替id过滤对象,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有一个事件模型、序列化程序、视图集和一个标记模型、序列化程序、视图集。我想按标记和名称筛选事件。但只能通过标记id对其进行过滤 在标记序列化程序中,我在标记序列化程序中设置了lookup\u字段。当I‘filter_field=(tags_uname)’时的选项不合适,因为lastGET参数更改了previous class Event(models.Model): tags = models.ManyToManyField('Tag') ... class Meta: or

我有一个事件模型、序列化程序、视图集和一个标记模型、序列化程序、视图集。我想按标记和名称筛选事件。但只能通过标记id对其进行过滤

在标记序列化程序中,我在标记序列化程序中设置了
lookup\u字段
。当I‘filter_field=(tags_uname)’时的选项不合适,因为last
GET
参数更改了previous

class Event(models.Model):


tags = models.ManyToManyField('Tag')

...


class Meta:
    ordering = ['name']

def __str__(self):
    return self.name


class Tag(models.Model):
  name = models.CharField(unique=True, max_length=50)

  def __str__(self):
      return self.name

  def __unicode__(self):
      return '%s'% (self.name)



class EventSerializer(serializers.ModelSerializer):
  from accounts.api.serializers import ShortUserSerializer
  tags = serializers.SlugRelatedField(
      many=True,
      queryset=Tag.objects.all(),
      slug_field='name'
  )

  members_count = serializers.SerializerMethodField()

  author = ShortUserSerializer()

  max_members = serializers.IntegerField(required=False, default=-1)

  class Meta:
      model = Event
      fields = ['id', 'name', 'description', 'time_begins', 'author', 'members_count', 'max_members', 'tags',
              'avatar', 'date_expire', 'city', 'country', 'geo']
 ...

class TagSerializer(serializers.ModelSerializer):
  class Meta:
      model = Tag
      fields = '__all__'
      lookup_field = 'name'
      extra_kwargs = {
          'url': {'lookup_field': 'name'}
      }
...

class EventViewSet(viewsets.ModelViewSet):
  queryset = Event.objects.all()
  serializer_class = EventSerializer
  http_method_names = ['get', 'patch']
  filter_backends = (filters.SearchFilter, DjangoFilterBackend,)
  search_fields = ('name', 'author__username', )
  filter_fields = ('tags')
我收到的结果如下:

而且它确实有效

但我需要:


filter\u字段生成的默认过滤器集不考虑这种情况。对于对外关系,它使用了这个想法

因此,您必须像这样定义自定义过滤器集

class EventFilter(filters.FilterSet):
    tags = filters.CharFilter(field_name="tags__name", method='filter_tags')

    class Meta:
        model = Event
        fields = ['tags']

    def filter_tags(self, queryset, name, tags):
        return queryset.filter(tags__name__contains=tags.split(','))
然后您需要删除
filter\u字段
,并将其添加为
EventViewSet中的
filter\u类

class EventViewSet(viewsets.ModelViewSet):
  queryset = Event.objects.all()
  serializer_class = EventSerializer
  http_method_names = ['get', 'patch']
  filter_backends = (filters.SearchFilter, DjangoFilterBackend,)
  search_fields = ('name', 'author__username', )
  filter_class = EventFilter

filter\u字段生成的默认过滤器集不考虑这种情况。对于对外关系,它使用了这个想法

因此,您必须像这样定义自定义过滤器集

class EventFilter(filters.FilterSet):
    tags = filters.CharFilter(field_name="tags__name", method='filter_tags')

    class Meta:
        model = Event
        fields = ['tags']

    def filter_tags(self, queryset, name, tags):
        return queryset.filter(tags__name__contains=tags.split(','))
然后您需要删除
filter\u字段
,并将其添加为
EventViewSet中的
filter\u类

class EventViewSet(viewsets.ModelViewSet):
  queryset = Event.objects.all()
  serializer_class = EventSerializer
  http_method_names = ['get', 'patch']
  filter_backends = (filters.SearchFilter, DjangoFilterBackend,)
  search_fields = ('name', 'author__username', )
  filter_class = EventFilter

如果您尝试像这样使用
filterset\u fields=['tags\uu name',]


然后通过
?tags\uuu name=name

访问,如果您尝试这样使用
filterset\u字段=['tags\uu name',]


然后通过
?tags\uu name=name

访问。请共享您模型的代码。我已更新了我的问题并添加了模型请共享您模型的代码。我已更新了我的问题并添加了模型。结果与“filter\u fields=['tags\uu name']”相同,正在按一个标记进行搜索only@StasMercer查看更新后的答案,了解如何使用多个标记进行过滤,这几乎是正确的,我将tag\uuuu contains更改为tag\uuuu name\uuuu in,解决了问题。请编辑您的答案,我将其标记为已解决。与“filter_fields=['tags__name']”相同的结果是按一个标记搜索only@StasMercer查看更新后的答案,了解如何使用多个标记进行过滤,这几乎是正确的,我将tag\uuuu contains更改为tag\uuuu name\uuuu in,解决了问题。请编辑您的答案,我会将其标记为已解决