Django создает обычное представление администратора с полями, не относящимися к базе данных - PullRequest
0 голосов
/ 09 мая 2018

Я хотел бы создать обычное административное представление с полями с данными, которые я заполняю вручную, то есть за ними нет таблицы базы данных. По моему admin.py у меня это пока что

class TestAdmin(admin.ModelAdmin):
    pass

admin.site.register(Test, TestAdmin)

и в models.py

class Test(models.Model):
    test = models.BooleanField(
        default=True
    )

Но при этом я получаю сообщение об ошибке

django.db.utils.ProgrammingError: relation "..._test" does not exist

Django просматривает таблицу в базе данных, но в моей модели мне нужны только поля, данные которых я заполняю вручную

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Кажется, что вы на самом деле не понимаете, что такое Model и ModelAdmin. Класс Model представляет собой представление таблицы базы данных, а класс ModelAdmin представляет собой компонент, который обеспечивает функции администрирования для этой таблицы и ее содержимого. Итак, когда вы пишете, что «позади нет таблицы базы данных», вы как-то упускаете из виду: у вас не может быть ModelAdmin без модели, и вы не можете иметь модель без таблицы базы данных.

Короче говоря, вам придется либо

1 / использовать модель или

2 / написать все представления и шаблоны самостоятельно и подключить их к администратору.

Для второго решения см. Этот вопрос (и его ответы) , или просто Google для "django admin views без моделей" (есть пара приложений 3-ей части, которые должны помочь подключать пользовательские представления в админке).

Теперь первое решение может, или нет, в зависимости от ваших конкретных потребностей, быть таким же хорошим, как и второе, в зависимости от того, кто заполняет ваш s3bucket и как. Без модели вам придется запрашивать в файле список файлов каждый раз, когда кто-то обращается к вашему пользовательскому представлению администратора, что может быть довольно дорогостоящим. Если все загрузки в корзину s3 находятся под вашим контролем, вы можете использовать модель, чтобы сохранить локальный список файлов «кеш», и вам нужно будет нажимать s3 только для эффективной загрузки файла. Это также дает вам возможность хранить метаданные об этих файлах, которые можно использовать для поиска / фильтрации, и, в случае необходимости, связывать ваши файлы s3 с другими моделями. И, конечно, это означает, что вы получаете свой админ бесплатно;)

На самом деле, даже если у вас нет контроля над этими загрузками, вы все равно можете использовать модель по вышеуказанным причинам и иметь фоновую задачу (cron job или эквивалентную), которая обновляет вашу таблицу из содержимого корзины s3 (или - если s3 предоставляет веб-хуки - имейте конечную точку API, вызываемую s3 при загрузке, которая обновляет вашу таблицу).

0 голосов
/ 09 мая 2018

Способ работы ORM в django состоит в том, что все члены класса модели, который является экземпляром model.Field, будут сопоставлены со столбцом в базе данных.

Возможно иметь свойства модели, которые не отображаются в таблице базы данных. Например, вместо этого вы можете использовать @property.

class Test(models.Model):

    @property
    def test(self):
        return get_aws_bucket_value(self.id)

    @test.setter
    def test(self, value):
        set_aws_bucket_value(self.id, value)

Вы должны самостоятельно реализовать функции получения / установки aws.

Вы можете использовать свойства в качестве полей только для чтения в административном классе django. Будьте осторожны при использовании его в представлении списка, если вашей логике получения требуется синхронно получать данные с удаленного сервера, поскольку это может стать существенным узким местом производительности.

Если вы хотите иметь возможность устанавливать значения для сеттера от администратора django, вам придется написать пользовательский ModelForm для TestAdmin.

Здесь можно заставить Джанго делать то, что вы хотите. Но модели и администратор Django основаны на ORM, что означает использование реляционной базы данных в качестве постоянного хранилища. Если вы этого не хотите, вы можете столкнуться с тем, что боретесь против фреймворка и преодолеваете его чаще, чем извлекаете выгоду из «включенных батарей» Джанго. Этот проект может быть лучше решен с менее монолитной и менее самоуверенной структурой, такой как Flask вместо Django.

...