【问题标题】:many to many filter in django rest frameworkdjango rest框架中的多对多过滤器
【发布时间】:2019-03-06 12:18:23
【问题描述】:

我有一个关于过滤检索与多对多相关的数据的问题

models.py

class Team(models.Model):
    name = models.CharField(blank=True, unique=True, max_length=100)
    players = models.ManyToManyField(User, blank=True, related_name='players')

seializers.py

class MyTeamListSerializer(ModelSerializer):

    class Meta:
        model = Team
        fields = ['name']

views.py

class MyTeamListAPIView(ListAPIView):
    queryset = Team.objects.all()
    serializer_class = MyTeamListSerializer
    permission_classes = [IsOwnerOrReadOnly]
    pagination_class = ProfileLimitPagination
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('players')
    filter_class = TeamFilter

filters.py

class TeamFilter(django_filters.FilterSet):
    teams = django_filters.CharFilter(
        players='players__id',
        lookup_type='contains',
    )

    class Meta:
        model = Team
        fields = ('players', 'teams',)

现在,我要做的是,检索我所在球队的列表。

所以我想请求我的团队获取我的团队的响应列表。

我不知道确切的问题是什么,但我是 django rest 框架中的新手。

所以,请任何人有解决方案,请在我的情况下帮助我,或者如果您有其他解决方案来做我想做的事。

谢谢

【问题讨论】:

    标签: python django python-3.x django-rest-framework postman


    【解决方案1】:

    如果您需要获取特定球员的球队名单,请使用exact 查找而不是contains

    class TeamFilter(django_filters.FilterSet):
        teams = django_filters.NumberFilter(
            field_name='players_id',
            lookup_type='exact',
        )
    
        class Meta:
            model = Team
            fields = ('players', 'teams',)
    

    同时使用field_name 作为参数而不是players

    如果你只想显示当前用户的团队,你最好覆盖视图的get_queryset 方法:

    class MyTeamListAPIView(ListAPIView):
        serializer_class = MyTeamListSerializer
        permission_classes = [IsOwnerOrReadOnly]
        pagination_class = ProfileLimitPagination
        filter_backends = (filters.DjangoFilterBackend,)
        filter_fields = ('players')
        filter_class = TeamFilter
    
        def get_queryset(self):
            return Team.objects.filter(players=self.request.user)
    

    【讨论】:

    • 感谢您的快速回复,但我问我自己是否想要为特定玩家(请求)获取团队,我只需要与所请求用户相关的团队,在其他语言中只是我的团队。第一个问题你的代码服务于这一点?第二个如何在过滤器中获取requset.user?非常感谢
    • @hishamDigital 在这种情况下,您最好覆盖视图的 get_queryset 方法。检查更新的答案。
    • 非常感谢@neverwalkaloner 更新的答案对我来说很好。真的感谢 btw return Team.objects.filter(players_exact=self.request.user) 我从 players_exact 中删除了 exact 再次正常工作,谢谢
    猜你喜欢
    • 2013-01-22
    • 2023-03-18
    • 2014-02-17
    • 2019-03-16
    • 2012-12-24
    • 2017-05-27
    • 1970-01-01
    • 2018-10-15
    • 2017-10-26
    相关资源
    最近更新 更多