Попытка фильтрации django view сериализатора на основе вложенной модели foreignkey - PullRequest
0 голосов
/ 15 января 2019

У меня есть приложение Django. В ней у меня есть 2 модели. Один из них - группа, а другой - модель участника. Тогда у модели участника есть foriegnkey, который является моделью группы. Я сериализовал модели, и теперь я пытаюсь заставить API работать так, как я хочу. Я хочу иметь возможность вызывать API, в конце которого есть имя группы, которое передается в качестве фильтра для членов, чтобы они возвращали только членов имени группы. У меня есть 2 URL. первый возвращает всех членов каждой группы, а я хочу, чтобы второй возвращал только членов определенной группы. Я попробовал несколько разных вещей из предложений, но ни один из них не работает. Это последнее, что я попробовал ниже. Я добавлю свой код ниже.

Модель:

class Group(models.Model):
    name = models.CharField(max_length=42)
    description = models.CharField(max_length=220)
    user_count = models.IntegerField()
    status = models.CharField(max_length=12)
    image = models.ImageField(upload_to='group_images/')
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name + ' - ' + self.created_by.username

class Member(models.Model):
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    host = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.group.name + ' - ' + self.user.username 

Urls:

path('members/', MemberListView.as_view()),
path('members/<name>', MemberGroupListView.as_view()),

вид:

class MemberListView(ListAPIView):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer

class MemberGroupListView(ListAPIView):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_fields = ('user', 'host', 'group')

    def get_queryset(self):
        return self.queryset.filter(group__name=self.request.query_params.get('name'))

MemberListView работает нормально, но MemberGroupListView не работает.

enter image description here


Обновление:

добавил сериалзеры:

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('name', 'description', 'user_count', 'status', 'image', 'created_by')

class MemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = Member
        fields = ('group', 'user', 'host')

1 Ответ

0 голосов
/ 15 января 2019

Параметры URL, такие как name в вашем случае (path('members/<name>', MemberGroupListView.as_view()),), хранятся в self.kwargs в представлениях на основе классов, поэтому ваш get_queryset должен быть:

def get_queryset(self):
    return self.queryset.filter(group__name=self.kwargs.get('name'))
...