Django Rest Framework RetreiveAPIView get() 返回 2 个结果

Oma*_*ali 2 python django django-rest-framework

我有一个带有 django 休息框架的 django 项目。我正在尝试使用 Retreive API View 返回会员详细信息。我想根据在带有组名称的 url 中传递的参数来获取所有成员记录。我尝试使用.get().filter()。返回.get()了一个error of returning more than 2 items. 这.filter()不是字典的一部分。

我尝试.list过并且.retrieve

如何检索基于超过 1 项的数据对象。这是我正在调用的视图。

class MemberDetailView(RetrieveAPIView):
    queryset = Member.objects.all()
    serializer_class = MemberSerializer

    def get_object(self):
        return self.queryset.filter(group__name=self.kwargs.filter('name'))
Run Code Online (Sandbox Code Playgroud)

模型

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
Run Code Online (Sandbox Code Playgroud)

网址

path('members/', MemberListView.as_view()),
path('members/<name>', MemberDetailView.as_view()),
Run Code Online (Sandbox Code Playgroud)

_________________________________________-

更新:

所以当我覆盖列表时我收到错误:

TypeError at /api/groups/members/homiez list() got an unexpected keyword argument 'name'

当我不覆盖列表时,我得到一个空的结果对象。

这是我现在拥有的代码......

class MemberGroupListView(ListAPIView):
    serializer_class = MemberSerializer

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

    def list(self, request):
        # Note the use of `get_queryset()` instead of `self.queryset`
        queryset = self.get_queryset()
        serializer = MemberSerializer(queryset, many=True)
        return Response(serializer)
Run Code Online (Sandbox Code Playgroud)

楷模

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
Run Code Online (Sandbox Code Playgroud)

网址:

path('members/<name>', MemberGroupListView.as_view()),
Run Code Online (Sandbox Code Playgroud)

Ale*_*x C 5

RetrieveAPIView 旨在检索单个实例。您应该使用ListAPIView来代替。并使用get_queryset方法代替get_object

ListAPIView 使用参数调用序列化器many=True,该序列化器返回对象列表而不是一个。