Wagtail - Настройка нескольких баз данных - PullRequest
1 голос
/ 14 марта 2020

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

Я сделал следующие шаги (код ниже): 1. Создал файл models.py 2. Создал wagtail_hooks.py 3. Создал дополнительную ссылку на базу данных в base.py

Я ожидаю, что моя таблица mysql (бренды) будет отображаться в Wagtail CMS, но использует базу данных по умолчанию ( sqllite). (Сообщения об ошибках не возвращаются)

Код ссылки:

models.py

from django.db import models
from wagtail.core.models import Page
from wagtail.core.fields import RichTextField
from wagtail.admin.edit_handlers import FieldPanel

class Brand(models.Model):
    brandsid = models.AutoField(primary_key=True)
    brand = models.CharField(max_length=50, blank=False, null=False)
    class Meta:
        managed = True
        db_table = 'brands'
    panels = [
        FieldPanel('brand'),
    ]

wagtail_hooks.py

from wagtail.contrib.modeladmin.options import (
    ModelAdmin, modeladmin_register)
from .models import Brand


class BrandAdmin(ModelAdmin):
    model = Brand
    menu_label = 'Brands'  # ditch this to use verbose_name_plural from model
    menu_icon = 'pilcrow'  # change as required
    menu_order = 200  # will put in 3rd place (000 being 1st, 100 2nd)
    add_to_settings_menu = False  # or True to add your model to the Settings sub-menu
    exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view
    list_display = ('brand', 'brandurl',)
    list_filter = ('brand',)
    search_fields = ('brand', 'brandurl',)

# Now you just need to register your customised ModelAdmin class with Wagtail
modeladmin_register(BrandAdmin)

base.py (отрывок)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'mysql': {
        'NAME': 'mysql',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysqlusername',
        'PASSWORD': 'mysqlpassword'
    }
}

1 Ответ

0 голосов
/ 20 марта 2020

Решение было в том, что мне нужно было использовать инструкции из документов django здесь: https://docs.djangoproject.com/en/3.0/topics/db/multi-db/

Дополнительно к моим настройкам выше:

Я добавил это в base.py:

DATABASE_ROUTERS = ['routers.DbRouter']

Затем создал файл routers.py в моей директории проекта root:

class DbRouter:
    def db_for_read(self, model, **hints):
        # print(model._meta.app_label)
        if model._meta.app_label == 'brands':
            return 'mysql'
        return None

    def db_for_write(self, model, **hints):
        if model._meta.app_label == 'brands':
            return 'mysql'
        return None

    def allow_relation(self, obj1, obj2, **hints):
        if obj1._meta.app_label == 'brands' or \
           obj2._meta.app_label == 'brands':
           return True
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label == 'brands':
            return db == 'mysql'
        return None

Я также смог проверить, что это происходит файл routers.py, выполнив команду print (model._meta.app_label) внутри функции и проверив вывод консоли на runserver, который помог получить правильные настройки.

...