Sql Django查询到返回错误列的Postgres
我正面临一个奇怪的问题,可能与我找不到的缓存有关 我有以下型号:Sql Django查询到返回错误列的Postgres,sql,django,postgresql,django-models,Sql,Django,Postgresql,Django Models,我正面临一个奇怪的问题,可能与我找不到的缓存有关 我有以下型号: class Incubadores(models.Model): incubador=models.CharField(最大长度=10,主键=True) posicion=models.CharField(最大长度=10) 类Tareas(timestademodel): priority=models.CharField(最大长度=20,选项=PRIORITIES,默认值=normal') incubador=models.Fo
class Incubadores(models.Model):
incubador=models.CharField(最大长度=10,主键=True)
posicion=models.CharField(最大长度=10)
类Tareas(timestademodel):
priority=models.CharField(最大长度=20,选项=PRIORITIES,默认值=normal')
incubador=models.ForeignKey(Incubadores,on_delete=models.CASCADE,null=True,db_column='incubador')
info=JSONField(null=True)
datos=JSONField(null=True)
类元:
排序=('priority'、'modified'、'created')
我以前没有参数db\u column
,因此该字段的Postgres列是incubador\u id
我使用参数db_column
来更改列的名称,然后运行python manage.py makemgrations
和pythonmanage.py migrate
,但无论何时执行查询,我仍然会将列作为incubadores_id
,例如:
>>tareas=tareas.objects.all().values()
>>>印刷品(塔里亚)
我需要修改此列名,因为序列化程序存在其他问题。因此,改变是必要的
- 如果我在其他模型中执行相同的查询,其中我也更改了默认字段的名称。问题完全一样
- 它发生在shell和代码上
- 我尝试了不同的查询,以确保它与Django惰性查询系统无关,但问题是相同的。我还尝试执行了
李>django.db.connection.close()
- 如果我对PostgreSQL执行直接SQL查询,它无法找到
,而只能找到incubador\u id
,这是正确的incubador
>>> from django.core import serializers
>>> serializers.serialize("json", Tareas.objects.all())
'[{"model": "inc.tareas", "pk": 1, "fields": {"priority": "normal", "incubador": "test-i"}}]'
您可以在这里使用字段
属性,它似乎可以为您提供所需的内容
您没有指定“序列化程序的其他问题”是什么,但我的建议是编写自定义序列化代码。依赖类似于.values()
甚至Serializers.serialize()的内容
对我来说有点太含蓄了;如果此模型发生更改,编写显式序列化代码可以减少意外中断与序列化数据使用者的合同的可能性
注意:请尝试使用您提供的示例。我删除了一些字段,以便在stock Django中使用,这就是为什么序列化值缺少字段的原因;
\u id
问题在没有您使用的第三方应用程序的情况下仍然存在,并通过序列化程序解决。这也不是PG特有的;它也发生在sqlite中.您的代码运行正常。Django为所有外键附加\u id
本身。如果您的外键名为abc
,则它将保存在数据库中,作为abc\u id
abc
将包含该外键的完整对象。您可以这样尝试Tareas.objects.all()。值('id','incubador')
,那么您就可以理解它运行得很好了。@MuhammadHassan,我的原始代码包括.values()
函数,但我简化了示例中的代码,因为它无论如何都会发生。参数db\u列
删除了Django添加的\u id
。谢谢!!这就是原因,我开始疯狂了。关于序列化程序,我使用了DRF,我有一个错误,我正试图通过这种方式跟踪。但我认为我是不知道原因。否则我也会在另一个线程中发布。是的,看起来他们的序列化程序应该是一个好的、明确的方式。