python - 尝试基于嵌套模型外键过滤 django View 序列化器

标签 python django django-rest-framework django-views

我有一个 Django 应用程序。其中,我有 2 个模型。其中一个是团体,另一个是成员(member)模型。然后成员模型有一个外键,即组模型。我序列化了模型,现在我正在尝试让 api 按我想要的方式工作。我希望能够调用一个 api,该 api 末尾有一个组名称,该组名称作为成员的过滤器传递,以便仅返回组名称的成员。我有 2 个网址。第一个返回每个组的所有成员,而我希望第二个仅返回某个组的成员。我尝试了一些与建议不同的方法,但没有一个起作用。这是我在下面尝试的最后一件事。我将在下面添加我的代码。

型号:

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 

网址:

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')

最佳答案

网址参数,例如name在您的情况下( path('members/<name>', MemberGroupListView.as_view()), )存储在 self.kwargs 中在基于类的 View 中,所以你的 get_queryset应该是:

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

关于python - 尝试基于嵌套模型外键过滤 django View 序列化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54192871/

相关文章:

python - 使用发送命令时,“L3PacketSocket”对象没有属性 'ins'

c++ - SWIG:将异常从 Python 抛出到 C++

python - 无法运行 python manage.py 检查

python - 当 child 不能继承时如何创建基类?

python - 如果输入是 x 的倍数,如何采取不同的行动?

python - 如何用逗号将轴数格式格式化为千位

javascript - 通过Ajax发送文件到Django

python - 从自定义 Django 用户模型中删除密码

python - django 休息细节_路线测试

python - DRF:“ListSerializer”类型的对象不是JSON可序列化的