Django: запрос только для чтения без первичного ключа
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. id 'в' списке полей ')
В представлении нет первичного ключа. Есть ли способ обхода?
Комментарий:
Я не могу контролировать представление, с которым я обращаюсь с Django. В браузере MySQL отображаются столбцы, но первичный ключ отсутствует.
Ответы
Ответ 1
Когда вы говорите: "Я не контролирую представление, с которым я обращаюсь с Django. В браузере MySQL отображаются столбцы, но первичный ключ отсутствует.
Я предполагаю, что вы имеете в виду, что это устаревшая таблица, и вам не разрешено добавлять или изменять столбцы?
Если это так, и там действительно нет первичного ключа (даже столбца строки или не-int *), тогда таблица не была настроена очень хорошо, и производительность могла бы сильно вонять.
Тем не менее это не имеет значения для вас. Все, что вам нужно, это столбец, который гарантированно будет уникальным для каждой строки. Установите, что в вашей модели будет "primary_key = True", и Django будет счастлив.
- Есть еще одна возможность, которая была бы проблематичной. Если нет столбца, который гарантированно будет уникальным, тогда таблица может использовать составные первичные ключи. То есть - это указание, что два столбца, взятые вместе, предоставят уникальный первичный ключ. Это вполне допустимое реляционное моделирование, но, к сожалению, не поддерживается Django. В этом случае вы не можете сделать ничего, кроме исходного SQL, если не сможете добавить еще один столбец.
Ответ 2
У меня эта проблема все время. У меня есть представление, что я не могу или не хочу меняться, но хочу иметь страницу для отображения составной информации (возможно, в разделе администратора). Я просто переопределяю сохранение и создаю NotImplementedError:
def save(self, **kwargs):
raise NotImplementedError()
(хотя в большинстве случаев это, вероятно, не требуется, но это заставляет меня чувствовать себя немного лучше)
Я также установил False в класс Meta.
class Meta:
managed = False
Затем я просто выбираю любое поле и помечаю его как первичный ключ. Неважно, действительно ли это уникально с вами, просто делают фильтры для отображения информации на странице и т.д.
Кажется, все в порядке. Пожалуйста, отправьте, если есть какие-либо проблемы с этим методом, которые я пропускаю.
Ответ 3
Если в представлении нет первичного ключа, тогда нет обходного пути.
Django требует, чтобы каждая модель имела ровно одно поле primary_key=True
.
Ответ 4
При запуске syncdb
должно существовать автоматически сгенерированное поле id
(если в вашей модели нет первичного ключа, то Django вставляет AutoField
для вас).
Эта ошибка означает, что Django запрашивает вашу базу данных для поля id
, но не существует. Можете ли вы запустить django manage.py dbshell
, а затем DESCRIBE read_only_view;
и опубликовать результат? Это покажет все столбцы, которые находятся в базе данных.
В качестве альтернативы вы можете включить определение модели, которое вы исключили? (и подтвердите, что вы не изменили определение модели, так как вы запустили syncdb
?)