Подтвердить что ты не робот

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 отображаются столбцы, но первичный ключ отсутствует.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

    class Meta:
       managed = False

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

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

Ответ 4

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

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

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