【问题标题】:Original exception text was: 'QuerySet' object has no attribute 'client'原始异常文本是:“QuerySet”对象没有属性“client”
【发布时间】:2020-08-25 08:32:12
【问题描述】:

当我尝试在序列化程序 ClientSerializer 上获取字段 client 的值时,我得到了 AttributeError

序列化器字段可能命名不正确,并且与QuerySet 实例上的任何属性或键都不匹配。

models.py

class Box(models.Model):
    box = models.IntegerField()
    controller = models.ForeignKey(Controller, related_name='boxes', on_delete=models.CASCADE)

    def __str__(self):
        return str(self.box)


class Client(models.Model):
    client = models.CharField(max_length=30)
    cpf = models.IntegerField()
    box = models.OneToOneField(
    
        Box,
        on_delete=models.CASCADE,
        primary_key=True
    )

    def __str__(self):
        return self.client

serializers.py

class ClientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Client
        fields = [
            "id",
            "client",
            "cpf",
            "box",
        ]

class BoxSerializer(serializers.ModelSerializer):
    class Meta:
        model = Box
        fields = [
            "id",
            "box",
            "controller"
        ]

views.py


class ClientViewSet(viewsets.ModelViewSet):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()

    def list(self, request, store_pk=None, locker_pk=None, controller_pk=None, box_pk=None):
        queryset = Client.objects.filter(box=box_pk, box__controller=controller_pk, box__controller__locker=locker_pk, box__controller__locker__store=store_pk)
        serializer = ClientSerializer(queryset, context={'request': request})
        return Response(serializer.data)

    def retrieve(self, request, store_pk=None, locker_pk=None, controller_pk=None, box_pk=None):
        queryset = Client.objects.filter(box=box_pk, box__controller=controller_pk, box__controller__locker=locker_pk, box__controller__locker__store=store_pk)
        client = get_object_or_404(queryset)
        serializer = ClientSerializer(client, context={'request': request})
        return Response(serializer.data)

我正在尝试在lockers/1/controllers/1/boxes/1/client/ 上获取对象客户端 这是OneToOneField与盒子的关系,它在嵌套路由器中 我已经尝试过使用装饰器@action,但还是不行。

有人知道为什么找不到正确的对象属性吗?

【问题讨论】:

  • 因为一个集合对象没有该集合中元素的属性?

标签: python django django-rest-framework django-queryset django-rest-viewsets


【解决方案1】:

对于list 方法,您应该在创建新的序列化程序实例时使用many=True 参数:

serializer = ClientSerializer(queryset, context={'request': request}, many=True)

retrieve 的情况下,应该只接收一个对象。而不是

client = get_object_or_404(queryset)

您应该在查询集上调用first()last()(或最简单且最清楚的-.get(pk=pk))以检索从查询集中仅一项。然后你应该执行:

# client is one of elements of your queryset
serializer = ClientSerializer(client, context={'request': request})

【讨论】:

  • 谢谢兄弟,现在我很清楚我没有意识到方法返回了什么
猜你喜欢
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2021-06-12
  • 2021-06-18
相关资源
最近更新 更多