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

如何在Django ORM中指定自定义字段实现LEFT JOIN关联(非_id)

解决方案

要实现你需要的LEFT JOIN关联,只需在Django模型中通过ForeignKey的to_field参数指定自定义关联字段,同时关闭数据库外键约束(因为现有数据库无法修改结构)。以下是修改后的模型定义:

class ClanInfoModels(models.Model):
    clan_id = models.IntegerField()
    name = models.CharField(max_length=80)

    class Meta:
        db_table = 'clan_subpledges'
        managed = False


class ClanModels(models.Model):
    clan_id = models.IntegerField()
    hasCastle = models.IntegerField(primary_key=True)
    # 关联到ClanInfoModels的clan_id字段
    clan_info = models.ForeignKey(
        ClanInfoModels,
        on_delete=models.DO_NOTHING,
        to_field='clan_id',
        db_constraint=False,
        blank=True,
        null=True,
        related_name='clan_data'
    )

    class Meta:
        db_table = 'clan_data'
        managed = False


class CastleModels(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=11)
    # 关联到ClanModels的hasCastle字段,对应LEFT JOIN
    clan = models.ForeignKey(
        ClanModels,
        on_delete=models.DO_NOTHING,
        to_field='hasCastle',
        db_constraint=False,
        blank=True,
        null=True,
        related_name='castles'
    )

    class Meta:
        db_table = 'castle'
        managed = False
        ordering = ['id']

关键参数说明

  • to_field:指定关联目标模型中的具体字段,替代默认的主键关联。这里CastleModels关联ClanModels的hasCastle,ClanModels关联ClanInfoModels的clan_id。
  • db_constraint=False:因为现有数据库没有创建外键约束,必须关闭这个参数避免Django尝试创建约束。
  • blank=True, null=True:允许关联字段为空,对应SQL中LEFT JOIN的特性(即使没有匹配的记录也会返回主表数据)。
  • on_delete=models.DO_NOTHING:因为数据库没有外键,删除关联数据时无需执行任何操作,避免报错。

执行目标查询

通过Django ORM可以生成你需要的SQL,示例代码如下:

from django.db.models import F

# 查询并映射字段
result = CastleModels.objects.values(
    'name',
    'id',
    name_clan=F('clan__clan_info__name')
).select_related('clan', 'clan__clan_info')

执行这个查询后,Django会生成与你需求一致的LEFT JOIN SQL语句,返回包含name、id和name_clan的结果集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:50:45