@mmailcompany

Избавиться от дублей или проверить наличие таблицы в базе?

Имеется модель Options для всех настроек проекта. Имеется также модель General (общие настройки по типу название сайта, описание иконки, логотипы и бла бла бла), которая наследуется от Options.

Суть проблемы:
во вьюхе получаю, например глобально, так
options_general = General.objects.filter(id='-1').first()

//далее кидаю в data и использую в функциях/классах представления
data = {
    'menu' : Menu,
    'options_general' : options_general,
}


и все бы хорошо, но, закинув проект на ubuntu, у которой «морда» в инет смотрит, не удается сделать миграцию, все крашиться ибо таблицы нет такой (логично).

можно, к примеру, сделать через функцию с проверкой:
def Options_General():
    option = Options.objects.filter(option_name='options_general').first()
    options_general = General.objects.filter(id='-1').first() if option else ''
    return options_general

data = {
    'menu' : Menu,
    'options_general' : Options_General,
}


тогда все работает и миграция в том числе, но при таком раскладе вместо 5 квери запросов 29, что совсем не нравится...

пробовал использовать try / except, objects count, objects exists и другие варианты.

есть еще в голове вариант напрямую проверять через python:

from django.conf import settings

if settings.DEBUG:
    import sqlite3
    conn = sqlite3.connect('db.sqlite3')
    cursor = connection.cursor()

.....

else:
    import mariadb
    import sys
    try:
        conn_params = {

...

но на сколько это правильно?

вытекающий вопрос: как все правильно это реализовать? Или корректно проверить таблицу в базе, чтоб запросов было помнимому и миграция не крашилась?
  • Вопрос задан
  • 71 просмотр
Решения вопроса 1
@pro100Code
TechnoCraft Designer Developer
Добрый день! Проблема с миграциями и запросами действительно может возникнуть, если таблицы ещё не существуют, а запросы к ним уже происходят.
Прямую проверку существования таблицы можно выполнить через метод django.db.connection.introspection.table_names(), который возвращает список всех таблиц базы данных. Это позволит вам избежать излишней ручной работы с соединениями и подключениями.
from django.db import connection

def options_general_exists():
    tables = connection.introspection.table_names()
    if 'yourapp_general' in tables:
        return General.objects.filter(id='-1').first()
    return None

data = {
    'menu': Menu,
    'options_general': options_general_exists(),
}


Лучший вариант — использовать introspection API от Django для проверки существования таблиц, так как это встроенный и безопасный способ для работы с базой данных без необходимости явно подключаться к ней через Python.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы