You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现GET接口返回Links对象列表?

问题:如何编写返回短链接对象列表的GET方法

我正在开发一个完整URL转短链接的小项目,POST方法已经写好了,但写GET方法时出问题——现在请求必须传入full_url才能获取数据,想知道怎么写一个能返回所有对象列表的GET方法。

我的Model类:

class Links(models.Model):
    full_url = models.URLField(unique=True)
    short_url = models.CharField(
        max_length=20,
        unique=True,
        db_index=True,
        blank=True
    )
    requests_count = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)

    class Meta:
        ordering = ('-created_at',)

    def save(self, *args, **kwargs):
        if not self.short_url:
            while True:
                self.short_url = ''.join(
                    random.choices(
                        settings.CHARACTERS,
                        k=settings.TOKEN_LENGTH
                    )
                )
                if not Links.objects.filter(
                    short_url=self.short_url
                ).exists():
                    break
        super().save(*args, **kwargs)

    def __str__(self) -> str:
        return f'{self.short_url} -> {self.full_url}'

已实现的views.py中的LinkAPIView:

class LinkAPIView(APIView):
    authentication_classes = [JWTAuthentication]
    permission_classes = [IsAuthenticated]
    
    def post(self, request):
        serializer = LinkSerializer(data=request.data)
        if serializer.is_valid(raise_exception=True):
            token, status_code = serializer.create(
                validated_data=serializer.validated_data
            )
            return Response(LinkSerializer(token).data, status=status_code)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
解决方案

直接在LinkAPIView类中新增get方法即可实现需求,以下是两种实现方式:

1. 基础版:直接返回当前用户的所有活跃短链接列表

如果你的Links模型关联了用户字段(比如user = models.ForeignKey(User, on_delete=models.CASCADE)),可以按用户过滤;若未关联用户,直接查询所有活跃链接即可:

def get(self, request):
    # 若模型未关联用户,替换为 links = Links.objects.filter(is_active=True)
    links = Links.objects.filter(user=request.user, is_active=True)
    serializer = LinkSerializer(links, many=True)
    return Response(serializer.data, status=status.HTTP_200_OK)

2. 增强版:同时支持单链接查询和列表返回

如果需要保留“传入full_url获取单个链接”的功能,同时支持无参数返回列表,可以在get方法中增加参数判断:

def get(self, request):
    full_url = request.query_params.get('full_url')
    if full_url:
        # 按full_url查询单个链接
        try:
            link = Links.objects.get(user=request.user, full_url=full_url, is_active=True)
            serializer = LinkSerializer(link)
            return Response(serializer.data, status=status.HTTP_200_OK)
        except Links.DoesNotExist:
            return Response({"detail": "链接不存在"}, status=status.HTTP_404_NOT_FOUND)
    else:
        # 返回当前用户的所有活跃链接列表
        links = Links.objects.filter(user=request.user, is_active=True)
        serializer = LinkSerializer(links, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

注意事项

  • 确保你的LinkSerializer是ModelSerializer,默认支持序列化多个对象,调用时传入many=True即可返回列表格式数据。
  • 代码保持了原有的JWT认证和登录权限验证逻辑,只有授权用户能访问自己的链接数据。

内容的提问来源于stack exchange,提问作者pipka2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:51:08