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

基于Django和DRF对接现有数据库:如何保留FK的_id后缀?

如何在Django/DRF对接现有数据库时保留外键字段的_id后缀

针对你对接现有数据库、需要保留foo_id外键字段后缀的需求,有两种直接的解决方案:

方案一:修改模型字段名,指定数据库映射

直接将模型中的外键字段命名为foo_id,同时通过db_column参数明确关联数据库中的foo_id字段,完全匹配现有schema:

class Bars(models.Model):
    bar_id = models.IntegerField(primary_key=True)
    foo_id = models.ForeignKey('Foos', on_delete=models.CASCADE, db_column='foo_id')

    class Meta:
        db_table = 'Bars'  # 指定对应数据库表名,避免Django自动生成表名

class Foos(models.Model):
    foo_id = models.IntegerField(primary_key=True)

    class Meta:
        db_table = 'Foos'
  • 模型字段名与数据库字段完全一致,直接满足保留_id后缀的需求
  • 注意:此时访问关联的Foos实例用bar.foo_id,访问原始ID数值用bar.foo_id_id(Django自动为ForeignKey生成的后缀属性)

方案二:保持模型字段不变,序列化时输出_id后缀

如果不想修改模型结构,仅需在DRF序列化器中调整输出字段名即可:

from rest_framework import serializers
from .models import Bars, Foos

class BarsSerializer(serializers.ModelSerializer):
    # 支持读写场景用PrimaryKeyRelatedField
    foo_id = serializers.PrimaryKeyRelatedField(source='foo', queryset=Foos.objects.all())
    # 只读场景用IntegerField更简洁
    # foo_id = serializers.IntegerField(source='foo.id')

    class Meta:
        model = Bars
        fields = ['bar_id', 'foo_id']
  • 模型依然保留foo作为外键字段,但序列化后的响应会输出foo_id字段,符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:25:39