фильтр «многие ко многим» в структуре отдыха django - PullRequest
0 голосов
/ 01 октября 2018

У меня была проблема с фильтрацией получения данных по отношению ко многим

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 framework.

поэтому, пожалуйста, у любого есть решение, пожалуйста, помогите мне в моем случаеили если у вас есть другое решение, чтобы делать то, что я хочу.

спасибо

1 Ответ

0 голосов
/ 01 октября 2018

Если вам нужно получить список команд конкретного игрока, используйте exact lookup вместо 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)
...