4

I'm trying to migrate my apps, so this error it's happening "django.db.utils.ProgrammingError: relation "users_user" does not exist". I tried with many ways and this not running. I'm using multi-tenant configuration. Help me please.

    My manage.py migrate_schemas --list
    [standard:public] admin
    [standard:public]  [ ] 0001_initial
    [standard:public]  [ ] 0002_logentry_remove_auto_add
    [standard:public]  [ ] 0003_auto_20171127_1309
    [standard:public] auth
    [standard:public]  [X] 0001_initial
    [standard:public]  [X] 0002_alter_permission_name_max_length 
    [standard:public]  [X] 0003_alter_user_email_max_length
    [standard:public]  [X] 0004_alter_user_username_opts
    [standard:public]  [X] 0005_alter_user_last_login_null
    [standard:public]  [X] 0006_require_contenttypes_0002
    [standard:public]  [X] 0007_alter_validators_add_error_messages
    [standard:public] contenttypes
    [standard:public]  [X] 0001_initial
    [standard:public]  [X] 0002_remove_content_type_name
    [standard:public] foundation
    [standard:public]  (no migrations)
    [standard:public] sessions
    [standard:public]  [ ] 0001_initial
    [standard:public] sites
    [standard:public]  [X] 0001_initial
    [standard:public]  [X] 0002_alter_domain_unique
    [standard:public] tenants
    [standard:public]  (no migrations)
    [standard:public] users
    [standard:public]  [X] 0001_initial
    Traceback (most recent call last):
    File "manage.py", line 22, in <module>
    execute_from_command_line(sys.argv)
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", 
    line 350, in execute_from_command_line
    utility.execute()
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", 
    line 342, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "C:\Python27\lib\site-packages\django\core\management\base.py", line 
    348, in run_from_argv
    self.execute(*args, **cmd_options)
    File "C:\Python27\lib\site-packages\django\core\management\base.py", line 
    399, in execute
    output = self.handle(*args, **options)
    File "C:\Python27\lib\site-
    packages\tenant_schemas\management\commands\migrate_schemas.py", line 53, 
    in handle
    executor.run_migrations(tenants=tenants)
    File "C:\Python27\lib\site-
    packages\tenant_schemas\migration_executors\base.py", line 57, in 
    run_migrations
    if public_schema_name in tenants:
    TypeError: argument of type 'TenantQueryset' is not iterable

settings.py """ Django settings for ViaPortal_2 project.

    Generated by 'django-admin startproject' using Django 1.9.

    For more information on this file, see
    https://docs.djangoproject.com/en/1.11/topics/settings/

    For the full list of settings and their values, see
    https://docs.djangoproject.com/en/1.11/ref/settings/
    """


    import os

    # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

    PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))


    # Quick-start development settings - unsuitable for production
    # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/

    # SECURITY WARNING: keep the secret key used in production secret!
    SECRET_KEY = '*3*_u^(l*1ayvv+k578+^32u8ble*^d&#n=91ou%th0&1bp60^'

    # SECURITY WARNING: don't run with debug turned on in production!
    DEBUG = True

    ALLOWED_HOSTS = ['softvini.pythonanywhere.com',u'localhost' ]


    # Application definition

    SHARED_APPS = (
        'tenant_schemas',  # mandatory, should always be before any django app
        'tenants', # you must list the app where your tenant model resides in

        'django.contrib.contenttypes',

        # everything below here is optional
        'django.contrib.auth',
        'django.contrib.sessions',
       # 'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.admin',


    )

    TENANT_APPS = (
        'django.contrib.contenttypes',

        # your tenant-specific apps
        'users',
        'foundation',
        'notifications',

    )


    INSTALLED_APPS = [
        'tenant_schemas',

        'tenants',
        'django.contrib.contenttypes',
        'django.contrib.auth',
        'django.contrib.sessions',
        #'django.contrib.sites',
        'django.contrib.messages',
        'django.contrib.admin',

        'widget_tweaks',
        'foundation',
        'users',
        'notifications',
        'main',

    ]

    TENANT_MODEL = "tenants.Tenant" # app.Model
    AUTH_USER_MODEL = 'users.User'



    LOGIN_URL = 'auth/login/'



    DATABASE_ROUTERS = (
        'tenant_schemas.routers.TenantSyncRouter',
    )


    MIDDLEWARE_CLASSES = [
        'tenant_schemas.middleware.TenantMiddleware',
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.csrf.CsrfViewMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]


    MIGRATION_MODULES = {       
        'sites': 'contrib.sites.migrations'         
    }

    ROOT_URLCONF = 'ViaPortal_2.urls'

    '''
    TEMPLATE_LOADERS = (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader',
    )
    '''
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(PROJECT_PATH, 'templates'),],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]

    WSGI_APPLICATION = 'ViaPortal_2.wsgi.application'


    # Database
    # https://docs.djangoproject.com/en/1.11/ref/settings/#databases


    DATABASES = {

       'default': {
           'ENGINE': 'tenant_schemas.postgresql_backend', 
           'NAME': 'viaportal_py',
           'USER': 'postgres',
           'PASSWORD': 'my_pass',
           'HOST': 'localhost',
           'PORT': '5432',
        }         


    }



    # Password validation
    # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators

    AUTH_PASSWORD_VALIDATORS = [
        {
            'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
        },
        {
            'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
        },
    ]


    # Internationalization
    # https://docs.djangoproject.com/en/1.11/topics/i18n/

    LANGUAGE_CODE = 'pt-br'

    TIME_ZONE = 'UTC'

    USE_I18N = True

    USE_L10N = True

    USE_TZ = True


    # Static files (CSS, JavaScript, Images)
    # https://docs.djangoproject.com/en/1.11/howto/static-files/

    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(PROJECT_PATH )
    MEDIA_ROOT = os.path.join(PROJECT_PATH,'media')
    MEDIA_URL = '/media/'

    DEFAULT_FILE_STORAGE = 'tenant_schemas.storage.TenantFileSystemStorage'

    STATICFILES_DIRS = (
        os.path.join(PROJECT_PATH, '/static/'),
        # '/var/www/static/',
    )





>

users.models.py # -- coding: utf-8 -- from future import unicode_literals from django.utils.http import urlquote from django.db import models from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager from django.contrib.auth.models import PermissionsMixin

    class UserManager(BaseUserManager):
        def create_user(self, *args, **kwargs):
            email = kwargs["email"]
            email = self.normalize_email(email)
            password = kwargs["password"]
            kwargs.pop("password")

            if not email:
                raise ValueError(_('É obrigatório informar um e-mail válido'))

            user = self.model(**kwargs)
            user.set_password(password)
            user.save(using=self._db)
            return user

        def get_short_name(self):
            "Returns the short name for the user."
            return self.first_name

        def create_superuser(self, *args, **kwargs):
            user = self.create_user(**kwargs)
            user.is_superuser = True
            user.is_staff = True
            user.save(using=self._db)
            return user
        @property
        def is_superuser(self):
            return self.is_admin

        @property
        def is_staff(self):
            return self.is_admin

        def has_perm(self, perm, obj=None):
            return self.is_admin

        def has_module_perms(self, app_label):
            return self.is_admin

    class User(PermissionsMixin, AbstractBaseUser):
        email = models.EmailField(
            verbose_name = ('Endereco de e-mail'),
            unique=True,
        )
        first_name = models.CharField(
            verbose_name = ('Nome'),
            max_length=50,
            blank=False,
            help_text= ('Informe seu nome'),
        )
        last_name = models.CharField(
            verbose_name= ('Sobrenome'),
            max_length=50,
            blank=False,
            help_text= ('Informe seu sobre nome'),
        )

        is_active = models.BooleanField(default=True)
        is_admin = models.BooleanField(default=False)
        is_staff = models.BooleanField(default=False)

        empresa   = models.ForeignKey('foundation.Empresa', blank=True, null=True)
        estabelecimento = models.ForeignKey('foundation.Estabelecimento', blank=True, null=True)

        def get_absolute_url(self):
            return "/users/%s/" % urlquote(self.pk)

        def get_full_name(self):
            """
            Returns the first_name plus the last_name, with a space in between.
            """
            full_name = '%s %s' % (self.first_name, self.last_name)
            return full_name.strip()

        def get_short_name(self):
            "Returns the short name for the user."
            return self.first_name

        USERNAME_FIELD = 'email'

        objects = UserManager()

    class Profile(models.Model):
        user = models.OneToOneField(User, related_name='profile')
        image_profile = models.ImageField(upload_to = 'static/users/', default = 'static/users/no-img.jpg') 
        Gender_Choices = (
            ('F', 'Feminino'),
            ('M', 'Masculino'),
            ('O', 'Outro'),
        )
        gender = models.CharField(max_length=1, choices= Gender_Choices)
        description   = models.TextField(max_length=300,blank=True, null=True)

foundation.models.py # -- coding: utf-8 -- from future import unicode_literals from django.db import models from django.conf import settings

    from datetime import datetime
    from django.utils import timezone
    # Create your models here.

    # Create your models here.



    class Empresa(models.Model):
        cod_empresa = models.CharField(max_length=5, unique=True)
        nome                = models.CharField(max_length=100)
        created_by = models.ForeignKey( settings.AUTH_USER_MODEL , related_name="creation_user_empresa",blank=True, null=True)
        created_date = models.DateField(default=timezone.now,blank=True)
        class Meta:
            verbose_name = (u'Empresa')
            verbose_name_plural = (u'Empresas')

        def __str__(self):
            return self.cod_empresa + " - " + self.nome   

        def __unicode__(self):
            return self.cod_empresa + " - " + self.nome

    class Estabelecimento(models.Model):
        cod_estabelecimento = models.CharField(max_length=5, unique=True)
        nome                = models.CharField(max_length=100)
        razao_social        = models.CharField(max_length=1000, blank=True)
        empresa             = models.ForeignKey(Empresa)
        logo_estab          = models.ImageField(upload_to = 'estabelecimentos/', default = 'estabelecimentos/no-estabelec.png') 
        created_by          = models.ForeignKey( settings.AUTH_USER_MODEL  , related_name="creation_user_estabelecimento",blank=True, null=True)
        created_date        = models.DateField(default=timezone.now,blank=True)
        class Meta:
            verbose_name = (u'Estabelecimento')
            verbose_name_plural = (u'Estabelecimentos')

        def __str__(self):
            return self.cod_estabelecimento + " - " + self.nome

        def __unicode__(self):
            return self.cod_estabelecimento + " - " + self.nome 


    class CentroCusto(models.Model):
        cod_centrocusto = models.CharField(max_length=20, unique=True)
        nome = models.CharField(max_length=100)
        estabelecimento = models.ForeignKey(Estabelecimento) 
        created_by          = models.ForeignKey( settings.AUTH_USER_MODEL  , related_name="creation_user_centrocusto",blank=True, null=True)
        created_date        = models.DateField(default=timezone.now,blank=True)

        class Meta:
            verbose_name = (u'Centro de Custo')
            verbose_name_plural = (u'Centros de Custos')

        def __str__(self):
            return self.cod_centrocusto + " - " + self.nome 

        def __unicode__(self):
            return self.cod_centrocusto + " - " + self.nome

    class Departamento(models.Model):
        nome = models.CharField(max_length=100)
        estabelecimento = models.ForeignKey(Estabelecimento)
        centroCusto = models.ForeignKey(CentroCusto)
        created_by          = models.ForeignKey( settings.AUTH_USER_MODEL  , related_name="creation_user_departamento" ,blank=True, null=True)
        created_date        = models.DateField(default=timezone.now,blank=True)

        class Meta:
            verbose_name = (u'Centro de Custo')
            verbose_name_plural = (u'Centros de Custos')

        def __str__(self):
            return self.nome 
        def __unicode__(self):
            return self.nome
8
  • What is your project structure? Do you have app called users? Commented Nov 28, 2017 at 6:56
  • Yes, I have an app called users and there is a model called User in models.py. I'm using a abstract user from django user_auth_model. Commented Nov 28, 2017 at 18:15
  • Did you find a solution meanwhile? Stuck with the same problem. Commented May 22, 2018 at 14:56
  • Same problem here. Commented Mar 19, 2019 at 1:14
  • Same problem too Commented Apr 9, 2019 at 13:08

2 Answers 2

4

did you manage to solve this issue ? If not, this is what worked for me:

SHARED_APPS = (
'tenant_schemas',  # mandatory
'apps.user',
'apps.customer',  # must list the app where tenant model resides in
'django.contrib.contenttypes',
# everything below here is optional
'rest_framework',
'django.contrib.auth',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django.contrib.staticfiles',
'django_extensions',
)
TENANT_APPS = (
'apps.user',
'apps.home',
'django.contrib.contenttypes',
# tenant-specific apps
)
INSTALLED_APPS = list(set(SHARED_APPS + TENANT_APPS))

Migration commands:

  1. python manage.py makemigrations customer
  2. python manage.py makemigrations user
  3. python manage.py migrate_schemas --shared
Sign up to request clarification or add additional context in comments.

Comments

1

Just as @mjoyshuvo said

'app.user'

should be on both TENANT_APPS and SHARED_APPS due to the fact that some apps in the shared apps try to reference it and it doesn't seems to exists.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.