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

在Django Rest Framework视图中调用外部数据库的实现求助

在Django Rest Framework中访问外部数据库并返回API数据

1. 配置外部数据库连接

在项目的settings.py中,为DATABASES添加额外的数据库配置,示例如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'external_db': {  # 外部数据库的配置项
        'ENGINE': 'django.db.backends.mysql',  # 根据实际数据库类型调整,如postgresql、oracle等
        'NAME': 'external_db_name',
        'USER': 'db_username',
        'PASSWORD': 'db_password',
        'HOST': 'db_host_address',
        'PORT': 'db_port',
    }
}

2. 创建外部数据库对应的模型

在目标app的models.py中,定义与外部数据库表结构完全匹配的模型,务必设置managed=False,避免Django尝试修改外部数据库的表结构:

from django.db import models

class ExternalOrder(models.Model):
    order_id = models.CharField(primary_key=True, max_length=50)
    customer_name = models.CharField(max_length=100)
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    create_time = models.DateTimeField()

    class Meta:
        db_table = 'external_order_table'  # 外部数据库中实际的表名
        managed = False

3. 在DRF视图中查询外部数据库数据

在视图类中,通过using()方法指定使用外部数据库进行查询,再序列化返回数据:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import ExternalOrder
from .serializers import ExternalOrderSerializer

class ExternalOrderListView(APIView):
    def get(self, request):
        # 指定使用external_db数据库查询
        orders = ExternalOrder.objects.using('external_db').all()
        serializer = ExternalOrderSerializer(orders, many=True)
        return Response(serializer.data)

4. 编写序列化器

在serializers.py中创建对应序列化器,写法与普通DRF序列化器一致:

from rest_framework import serializers
from .models import ExternalOrder

class ExternalOrderSerializer(serializers.ModelSerializer):
    class Meta:
        model = ExternalOrder
        fields = ['order_id', 'customer_name', 'total_amount', 'create_time']

5. 配置URL路由

在项目或app的urls.py中添加对应路由:

from django.urls import path
from .views import ExternalOrderListView

urlpatterns = [
    path('external-orders/', ExternalOrderListView.as_view(), name='external-orders'),
]

关键注意事项

  • 确保安装对应数据库的驱动包:如MySQL需安装mysqlclient,PostgreSQL需安装psycopg2-binary
  • 模型字段必须与外部数据库表的字段完全匹配(类型、长度、约束等),否则会出现查询异常
  • 若外部数据库为非关系型数据库(如MongoDB),可直接使用对应客户端库(如pymongo)查询,手动构造返回数据即可,无需定义Django模型

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:30:57