gpt4 book ai didi

sql - Django 查询 Postgres 返回错误列

转载 作者:行者123 更新时间:2023-11-29 13:38:39 26 4
gpt4 key购买 nike

我遇到了一个奇怪的问题,可能与我找不到的某些缓存有关。

我有以下模型:

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,这是正确的。

有人知道会发生什么吗?我已经遇到这个问题 2 天了,我找不到原因:( 这是一个非常基本的操作。

谢谢!

最佳答案

This answer将解释为什么会这样。

Django 的内置序列化程序没有这个问题,但可能不会产生您正在寻找的东西:

>>> from django.core import serializers
>>> serializers.serialize("json", Tareas.objects.all())
'[{"model": "inc.tareas", "pk": 1, "fields": {"priority": "normal", "incubador": "test-i"}}]'

可以在此处使用fields 属性,这似乎可以为您提供所需的内容。

您没有具体说明“序列化程序的其他问题”是什么,但我的建议是编写自定义序列化代码。依赖像 .values() 甚至 serializers.serialize() 这样的东西对我来说有点太含蓄了;如果此模型发生变化,编写显式序列化代码可以降低您意外破坏与序列化数据使用者的契约(Contract)的可能性。

注意:请尝试制作您提供的示例minimal and reproducible .我删除了一些字段以使其与库存 Django 一起使用,这就是序列化值缺少字段的原因; _id 问题在没有您使用的第三方应用程序的情况下仍然存在,并且已通过序列化程序解决。这也不是 PG 特有的;它也发生在 sqlite 中。

关于sql - Django 查询 Postgres 返回错误列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58743942/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com