首页 > 解决方案 > 如何更改 Django 中外键的 db_column 名称?

问题描述

如何在 Django 中更改外键的 db_column?


class A(models.Model):
    it_id = models.CharField('IT ID', max_length=10)

class B(models.Model):
    it_id = models.ForeignKey('A', related_name='item', on_delete=models.PROTECT, db_column='it_id')

当我调用对象时,

>>> B.objects.all().values()
<QuerySet [{'it_id_id'}:'xxx']>

它是'it_id_id'....

如何从“it_id_id”更改“it_id”?

标签: pythondjangoforeign-keys

解决方案


这与数据库列的名称无关,而是与Django字段的名称有关。Django 会自动…_id为 s 添加一个后缀ForeignKey,然后存储被引用对象的主键。因此, aForeignKey的名称以 a 结尾是没有意义的…_id。有关详细信息,请参阅_id后缀 antipattern

因此,您可以将模型更改为:

class B(models.Model):
    it = models.ForeignKey(
        'A',
        related_name='item',
        on_delete=models.PROTECT
    )

如果您不想这样做,您可以it_id通过别名获取 的值:

from django.db.models import F

B.objects.values(it_id=F('it_id_id'))

推荐阅读