在使用values时尝试获取字段的值时出现AttributeError

2024-07-02 11:50:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在阅读了django文档和django rest框架文档之后,我遇到了无法解决的错误,即使我阅读了stackoverflow的所有相关问题,我仍然无法解决它。你知道吗

完整的错误消息如下:

AttributeError at /api/v1/task/target/subdomain/get_by_target/
Got AttributeError when attempting to get a value for field `target_id` on serializer `TargetSubdomainSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `tuple` instance.
Original exception text was: 'tuple' object has no attribute 'target_id'.

我想在我的表中得到distinct结果,所以我使用django filter和distinct,当我只使用filter时,代码运行正确,但是当我同时使用filter和values\u list时,它会出错。你知道吗

TargetSubdomain模型如下:

class TargetSubdomain(models.Model):
    target_id = models.IntegerField(help_text='目标ID')
    domain = models.CharField(max_length=200, help_text='域名')
    source = models.CharField(max_length=20, help_text='子域名来源')

    created_at = models.BigIntegerField(default=0, help_text='创建时间')
    updated_at = models.BigIntegerField(default=0, help_text='更新时间')

    def save(self, **kwargs):
        if not self.id:
            self.created_at = int(time.time())
        self.updated_at = int(time.time())
        super(TargetSubdomain, self).save()

    class Meta:
        db_table = 'nw_target_subdomain'

TargetSubdomainSerializer如下所示:

class TargetSubdomainSerializer(serializers.ModelSerializer):
    class Meta:
        model = TargetSubdomain
        fields = '__all__'

TargetSubdomainViewSet如下所示:

class TargetSubdomainViewSet(viewsets.ModelViewSet):
    queryset = TargetSubdomain.objects.all().order_by('-id')
    serializer_class = TargetSubdomainSerializer

    @action(methods=['GET'], detail=False, url_name='get_by_target')
    def get_by_target(self, request):
        target_id = request.GET.get('targetId')


        # queryset = TargetSubdomain.objects.filter(target_id=target_id).values_list('id', 'target_id', 'domain').distinct()
        queryset = TargetSubdomain.objects.filter(target_id=target_id)

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        response = {
            'results': serializer.data
        }

        headers = self.get_success_headers(serializer.data)
        return Response(response, status=status.HTTP_200_OK, headers=headers)

当queryset来自queryset = TargetSubdomain.objects.filter(target_id=target_id)时,代码没有eror,但是当我尝试使用# queryset = TargetSubdomain.objects.filter(target_id=target_id).values_list('id', 'target_id', 'domain').distinct()获得不同的结果时,它将引发属性错误。你知道吗


Tags: textselfidtargetgetbyobjectsmodels
1条回答
网友
1楼 · 发布于 2024-07-02 11:50:33

values_list查询集的行为类似于元组列表,因此每个元组没有target_id属性。在这种情况下,为什么要使用值列表?如果您试图对提供给值列表的那些字段获取unqiue,您可以使用distinct(*fields)。但只适用于PostgresSQL。否则,根据您的第一个查询集获取所有这些内容,然后在Python中执行重复数据消除。你知道吗

https://docs.djangoproject.com/en/2.2/ref/models/querysets/#distinct

def get_queryset(self):
    subdomains = TargetSubdomain.objects.filter(target_id=target_id)
    unique = {
        subdomain.domain:subdomain for subdomain in subdomains
    }
    return unique.values()

相关问题 更多 >