Джанго запрос к Postgres возвращает неправильный столбец - PullRequest
1 голос
/ 07 ноября 2019

Я столкнулся со странной проблемой, которая может быть связана с некоторым кешем, который я не могу найти.

У меня есть следующие модели:

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}]>

Мне нужно изменить имя этого столбца, потому что у меня другие проблемы с сериализаторами. Поэтому изменение необходимо.

  • Если я выполню тот же запрос в других моделях, где я также изменил имя поля по умолчанию. Проблема точно такая же.
  • Это происходит как в оболочке, так и в коде.
  • Я пробовал с разными запросами, чтобы убедиться, что это не связано с системой отложенных запросов Django,но проблема та же. Я также пытался выполнить django.db.connection.close().
  • Если я делаю прямой SQL-запрос к PostgreSQL, он не может найти incubador_id, но только incubador, что правильно.

Любой может иметь представление о том, что может бытьпроисходит? Я уже 2 дня с этой проблемой, и я не могу найти причину :( Это очень простая операция.

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2019

Этот ответ объяснит, почему это происходит.

Встроенные сериализаторы 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() слишком неявно для меня;написание явного кода сериализации снижает вероятность того, что вы случайно нарушите контракт с потребителем ваших сериализованных данных, если эта модель изменится.

Примечание. Попробуйте сделать приведенный вами пример минимальным. и воспроизводимый . Я удалил некоторые поля, чтобы это работало со стандартным Django, поэтому в сериализованном значении отсутствуют поля;проблема _id все еще существовала без сторонних приложений, которые вы используете, и была решена с помощью сериализаторов. Это также не относится к PG;это происходит и в sqlite.

...