Джанго:Запрос представления только для чтения без первичного ключа
-
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
?)