如何在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
相关产品推荐
相关产品推荐

