Джанго:Запрос представления только для чтения без первичного ключа

StackOverflow https://stackoverflow.com/questions/605896

  •  03-07-2019
  •  | 
  •  

Вопрос

class dbview(models.Model):
    # field definitions omitted for brevity
    class Meta:
        db_table = 'read_only_view'

def main(request):
    result = dbview.objects.all()

Обнаружено исключение при рендеринге:(1054, «Неизвестный столбец 'read_only_view.идентификатор' в 'списке полей'")

Есть нет первичного ключа Я вижу в представлении.Есть ли обходной путь?

Комментарий:
Я не могу контролировать представление, к которому имею доступ с помощью Django.Браузер MySQL показывает столбцы, но нет первичного ключа.

Это было полезно?

Решение

Когда вы говорите: «Я не могу контролировать представление, к которому имею доступ с помощью Django.Браузер MySQL показывает столбцы, но нет первичного ключа».

Я предполагаю, что вы имеете в виду, что это устаревшая таблица и вам не разрешено добавлять или изменять столбцы?

Если это так и действительно нет первичного ключа (даже строки или столбца, отличного от целочисленного*), то таблица настроена не очень хорошо, и производительность может сильно снизиться.

Хотя для тебя это не имеет значения.Все, что вам нужно, — это столбец, который гарантированно будет уникальным для каждой строки.Установите для этого параметра значение «primary_key = True» в вашей модели, и Django будет счастлив.

  • Есть еще одна возможность, которая может оказаться проблематичной.Если нет столбца, уникальность которого гарантирована, возможно, в таблице используются составные первичные ключи.То есть указывается, что два столбца, взятые вместе, дадут уникальный первичный ключ.Это совершенно правильное реляционное моделирование, но, к сожалению, не поддерживается Django.В этом случае вы ничего не сможете сделать, кроме чистого SQL, если не сможете добавить еще один столбец.

Другие советы

У меня эта проблема возникает постоянно.У меня есть представление, которое я не могу или не хочу менять, но я хочу иметь страницу для отображения составной информации (возможно, в разделе администратора).Я просто переопределяю сохранение и вызываю NotImplementedError:

    def save(self, **kwargs):
        raise NotImplementedError()

(хотя, возможно, в большинстве случаев это и не нужно, но мне от этого становится немного легче)

Я также установил значение False в классе Meta.

    class Meta:
       managed = False

Затем я просто выбираю любое поле и отмечаю его как первичный ключ.Неважно, действительно ли это уникально, ведь вы просто делаете фильтры для отображения информации на странице и т. д.

Кажется, у меня все работает нормально.Пожалуйста, прокомментируйте, есть ли какие-либо проблемы с этой техникой, которые я упускаю из виду.

Если действительно есть нет первичного ключа в представлении, то обходного пути нет.

Django требует, чтобы каждая модель имела ровно одно поле. primary_key=True.

Должен был быть автоматически сгенерированный id поле, когда ты бежал syncdb (если в вашей модели не определен первичный ключ, Django вставит AutoField для тебя).

Эта ошибка означает, что Django запрашивает у вашей базы данных id поле, но его не существует.Ты можешь бежать django manage.py dbshell а потом DESCRIBE read_only_view; и опубликовать результат?Это покажет все столбцы, которые есть в базе данных.

Альтернативно, можете ли вы включить исключенное вами определение модели?(и убедитесь, что вы не изменили определение модели с момента запуска syncdb?)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top