Использование postgis и mongodb django - PullRequest
0 голосов
/ 26 октября 2019

Я использую django (2, 1, 5, 'final', 0).

Моя проблема, я пытаюсь сохранить модель адреса в postgresql, все остальные модели (аутентификация, продукты ... ) в движке mongodb с пакетом djongo. модели, хранящиеся в app => geolocalise:

class Address(models.Model):

    line1 = models.CharField(max_length=150)
    line2 = models.CharField(max_length=150, blank=True)
    postalcode = models.CharField(max_length=10)
    city = models.CharField(max_length=150)
    country = models.CharField(max_length=150, default="France")
    #the postgis entry
    location = models.PointField(null=True)
    latitude = models.FloatField( default=0)
    longitude = models.FloatField( default=0)
    description = models.TextField(max_length=1024,blank=True)
    #user = models.ForeignKey('User', related_name='user', on_delete=models.CASCADE)

    def __str__(self):
        return "{0} - {1} - {2}".format(self.line1, self.postalcode, self.city)

здесь мои настройки py

DATABASES = {
'default': {
  'ENGINE': 'djongo',
  'NAME': 'DBNAME',
  'USER': 'USER',
  'PASSWORD': 'PASSWORD'},

'postgresql': {
  'ENGINE': 'django.contrib.gis.db.backends.postgis',
  'NAME': 'DBNAME',
  'USER': 'USER',
  'PASSWORD': 'PASSWORD'}} 

Но когда я выполняю свои миграции, я не знаю, почему база данных хранится в mongodb.

Я попробовал конфигурацию в router.py, которую я нашел в stackoverflow, но она не работает:

class GeolocaliseRouter(object):
def db_for_read(self, model, **hints):
    """
    Attempts to read auth models go to auth_db.
    """
    if model._meta.app_label == 'geolocalise':
        return 'postgresql'
    return None

def db_for_write(self, model, **hints):
    """
    Attempts to write auth models go to auth_db.
    """
    if model._meta.app_label == 'geolocalise':
        return 'postgresql'
    return None

def allow_relation(self, obj1, obj2, **hints):
    """
    Allow relations if a model in the auth app is involved.
    """
    if obj1._meta.app_label == 'geolocalise' or \
       obj2._meta.app_label == 'geolocalise':
       return True
    return None

def allow_migrate(self, db, app_label, model_name=None, **hints):
    """
    Make sure the auth app only appears in the 'auth_db'
    database.
    """
    if app_label == 'geolocalise':
        return db == 'postgresql'
    return None

Я протестировал несколько конфигураций, но в любое время я выполняю миграциюмодель находится в mongodb или все модели моего проекта идут в postgresql ....

Я новичок в django и благодарю вас за любую помощь

1 Ответ

0 голосов
/ 26 октября 2019

ОБНОВЛЕНИЕ

Так что после многих поисков я могу установить миграцию с 2 маршрутизаторами

geolocalise.router

geolocalise = ['geolocalise']

class GeolocaliseRouter(object):

    def db_for_read(self,model, **hints):
        if model._meta.app_label in geolocalise:
            return 'postgresql'
        return None

    def db_for_write(self,model, **hints):
        if model._meta.app_label in geolocalise:
            return 'postgresql'
        return None

    def allow_relation(self,obj1, obj2, **hints):
        if obj1._meta.app_label in geolocalise and \
           obj2._meta.app_label in geolocalise:
           return True
        return None

    def allow_syncdb(self,db, model):
        if db == 'postgresql':
            if model._meta.app_label in geolocalise:
                return True
        elif model._meta.app_label in geolocalise:
            return False
        return None

    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in geolocalise:
            return db == 'postgresql'
        return None

и для Монго

app = ['api','admin', 'booking', 'categories', 'notification', 'promocodes', 'publicity', 'reviews', 'space','transactions']


class DefaultRouter(object):

    def db_for_read(self,model, **hints):
        if model._meta.app_label in app:
            return 'default'
        return None

    def db_for_write(self,model, **hints):
        if model._meta.app_label in app:
            return 'default'
        return None

    def allow_relation(self,obj1, obj2, **hints):
        if obj1._meta.app_label in app and \
           obj2._meta.app_label in app:
           return True
        return None

    def allow_syncdb(self,db, model):
        if db == 'default':
            if model._meta.app_label in app:
                return True
        elif model._meta.app_label in app:
            return False
        return None


    def allow_migrate(self, db, app_label, model_name=None, **hints):
        if app_label in app:
            return db == 'default'
        return None

обновить файл setting.py, добавив

DATABASE_ROUTERS = ['backend.router.DefaultRouter', 'geolocalise.router.GeolocaliseRouter', ]

РЕДАКТИРОВАТЬ

Моя миграция применяется по этой команде:

python3 manage.py migrate geolocalise --database postgresql

Но мойвнешний ключ не работает должным образом, потому что django не обрабатывает отношения между двумя разными базами данных ... Один день потерян.

больше информации здесь: Невозможно сохранить с помощью save_model с использованием маршрутизатора базы данных

...