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

如何在Django Rest Framework中调用外部API获取随机用户数据并存储

你不需要在这个场景下使用JavaScript的fetch方法对接DRF,整个流程全部在DRF服务端完成即可,前端只需要向你的DRF接口发送携带count参数的POST请求就可以。具体实现步骤如下:

步骤1:安装依赖

使用Python的requests库发送外部HTTP请求,执行安装命令:

pip install requests

步骤2:定义存储随机身份数据的模型

首先创建模型存储生成的身份数据,关联对应用户,方便后续GET请求查询:

# models.py
from django.db import models
from django.contrib.auth import get_user_model

User = get_user_model()

class RandomIdentity(models.Model):
    # 关联生成这条数据的登录用户
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name="generated_identities")
    gender = models.CharField(max_length=10)
    full_name = models.CharField(max_length=100)
    email = models.EmailField()
    phone = models.CharField(max_length=30)
    id_number = models.CharField(max_length=50, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ["-created_at"]

创建完成后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

步骤3:编写序列化器

分别编写入参校验和结果返回的序列化器:

# serializers.py
from rest_framework import serializers
from .models import RandomIdentity

# 校验前端传入的生成数量参数
class GenerateCountSerializer(serializers.Serializer):
    count = serializers.IntegerField(min_value=1, max_value=5000) # 可根据randomuser.me的上限调整最大值

# 序列化返回身份数据
class RandomIdentitySerializer(serializers.ModelSerializer):
    class Meta:
        model = RandomIdentity
        fields = ["id", "gender", "full_name", "email", "phone", "id_number", "created_at"]
        read_only_fields = fields

步骤4:编写视图逻辑

核心逻辑在视图中实现,同时支持POST生成新数据、GET查询历史数据:

# views.py
import requests
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework import status
from .models import RandomIdentity
from .serializers import GenerateCountSerializer, RandomIdentitySerializer

class RandomIdentityView(APIView):
    # 仅允许已登录用户访问
    permission_classes = [IsAuthenticated]

    def get(self, request):
        # 返回当前登录用户所有历史生成的身份数据
        identities = RandomIdentity.objects.filter(owner=request.user)
        serializer = RandomIdentitySerializer(identities, many=True)
        return Response(serializer.data)

    def post(self, request):
        # 校验入参合法性
        count_serializer = GenerateCountSerializer(data=request.data)
        count_serializer.is_valid(raise_exception=True)
        generate_count = count_serializer.validated_data["count"]

        # 请求randomuser.me接口获取原始数据
        try:
            api_resp = requests.get(
                "https://randomuser.me/api/",
                params={"results": generate_count},
                timeout=30
            )
            # 响应异常直接抛出错误
            api_resp.raise_for_status()
            raw_user_list = api_resp.json()["results"]
        except requests.exceptions.RequestException:
            return Response(
                {"error": "获取随机身份数据失败,请稍后重试"},
                status=status.HTTP_503_SERVICE_UNAVAILABLE
            )

        # 批量构造数据对象并存库
        identity_obj_list = []
        for raw_user in raw_user_list:
            identity_obj_list.append(RandomIdentity(
                owner=request.user,
                gender=raw_user["gender"],
                full_name=f"{raw_user['name']['first']} {raw_user['name']['last']}",
                email=raw_user["email"],
                phone=raw_user["phone"],
                id_number=raw_user["id"]["value"]
            ))
        # 批量插入提升性能
        RandomIdentity.objects.bulk_create(identity_obj_list)

        # 返回生成的结果
        result_serializer = RandomIdentitySerializer(identity_obj_list, many=True)
        return Response(result_serializer.data, status=status.HTTP_201_CREATED)

步骤5:配置接口路由

将视图注册到项目路由中:

# urls.py
from django.urls import path
from .views import RandomIdentityView

urlpatterns = [
    path("identities/", RandomIdentityView.as_view(), name="random-identities"),
]

额外注意事项

  • 可以根据业务需求调整RandomIdentity的字段,randomuser.me返回的字段非常多,按需存储即可
  • 建议给接口加请求频率限制,避免短时间内大量请求触发randomuser.me的限流规则
  • 如果允许单次生成的数量很大,建议把请求外部API、存库的逻辑改成异步任务处理,避免接口超时
  • 如果不需要重复生成相同数量的身份数据,可以增加缓存逻辑,减少不必要的外部请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:45:02