【发布时间】:2020-03-03 18:01:52
【问题描述】:
我遇到了一个奇怪的问题,可能与我找不到的一些缓存有关。
我有以下型号:
class Incubadores(models.Model):
incubador = models.CharField(max_length=10, primary_key=True)
posicion = models.CharField(max_length=10)
class Tareas(TimeStampedModel):
priority = models.CharField(max_length=20, choices=PRIORITIES, default='normal')
incubador = models.ForeignKey(Incubadores, on_delete=models.CASCADE, null=True, db_column='incubador')
info = JSONField(null=True)
datos = JSONField(null=True)
class Meta:
ordering = ('priority','modified','created')
我之前没有参数 db_column,所以该字段的 Postgres 列是 incubador_id
我使用参数db_column 更改列的名称,然后我运行python manage.py makemgrations 和python manage.py migrate,但我仍然将列作为incubadores_id每当我执行查询时,例如:
>>> tareas = Tareas.objects.all().values()
>>> print(tareas)
<QuerySet [{'info': None, 'modified': datetime.datetime(2019, 11, 1, 15, 24, 58, 743803, tzinfo=<UTC>), 'created': datetime.datetime(2019, 11, 1, 15, 24, 58, 743803, tzinfo=<UTC>), 'datos': None, 'priority': 'normal', 'incubador_id': 'I1.1', 'id': 24}, {'info': None, 'modified': datetime.datetime(2019, 11, 1, 15, 25, 25, 49950, tzinfo=<UTC>), 'created': datetime.datetime(2019, 11, 1, 15, 25, 25, 49950, tzinfo=<UTC>), 'datos': None, 'priority': 'normal', 'incubador_id': 'I1.1', 'id': 25}]>
我需要修改此列名称,因为我在使用序列化程序时遇到了其他问题。所以改变是必要的。
- 如果我在其他模型中执行相同的查询,我也更改了默认字段的名称。问题完全一样。
- 它发生在 shell 和代码上。
- 我尝试了不同的查询,以确保它与 Django 惰性查询系统无关,但问题是相同的。我也试过执行
django.db.connection.close()。 - 如果我直接对 PostgreSQL 进行 SQL 查询,它找不到
incubador_id,而只能找到incubador,这是正确的。
有人知道会发生什么吗?我已经遇到这个问题两天了,我找不到原因:(这是一个非常基本的操作。
谢谢!
【问题讨论】:
-
您的代码运行良好。 Django 为所有外键附加
_id本身。如果您有名称为abc的外键,则在您的数据库中它将保存为abc_id。abc将包含该外键的完整对象。 -
你可以这样尝试
Tareas.objects.all().values('id', 'incubador'),然后你就可以理解它运行良好了。 -
@MuhammadHassan,我的原始代码包含
.values()函数,但我简化了示例中的代码,因为它无论如何都会发生。参数db_column删除了Django 添加的_id。
标签: sql django postgresql django-models