Migration fails when extending Django User Model - python

I'm trying to extend django User model by inheriting AbstractBaseUser so i can be able to manipulate the authentication process of the project.
Here is what my model looks like.
class AccountManager(BaseUserManager):
... create_user
... create_superuser
class Account(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=40, unique=True)
objects = AccountManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
And here is my settings INSTALLED_APPS
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'debug_toolbar',
'rest_framework',
'compressor',
'authentication'
]
AUTH_USER_MODEL = 'authentication.Account'
The problem here i notice the migration process that django is bypassing the auth.0001_initial and it jumped directly creating the admin.0001_initial making my migrations to fail with
django.db.utils.IntegrityError: (1215, u'Cannot add foreign key constraint')
How can i fixed this please help?

I was able to solve my issue, by this simple steps:
run python manage.py makemigrations authentication - because when using AUTH_USER_MODEL it will replace the migration of auth_user table of django.contrib.auth altering the migration process. Thus if we fail to provide migration file for authentication app migration will no doubt fails.
run python manage.py migrate.
Binggo!

Related

Migrations are not applying to specific model

The problem is whenever I try to migrate changes, migrations does'nt applying to this specific app which is named as Userinfo. The messege in my terminal is
Operations to perform:
Apply all migrations: admin, auth, books_details, contenttypes, sessions
Running migrations:
No migrations to apply.
And that app is not listed in my above list also i don't know what could be the reason
Models.py of that app
from django.db import models
import os
# from django.conf import settings
def upload_rename(instance,filename):
exe=filename.split('.')[-1]
filename=instance.user_name+'.'+exe
try:
os.remove(os.path.join('images','profile_image',instance.user_name,filename))
except:
pass
return os.path.join('profile_image',instance.user_name,filename)
class Userinfo(models.Model):
''' User info '''
user_name = models.CharField(max_length=30, unique=True, null=False,primary_key=True)
full_name = models.CharField(max_length=50, null=False)
user_email = models.EmailField(max_length=254)
college_name = models.CharField(max_length=50)
city = models.CharField(max_length=50)
country = models.CharField(max_length=50)
profile_img = models.ImageField(upload_to=upload_rename, blank=True)
''' The Change I added '''
varified_user =models.BooleanField(default=False)
Admin.py of that app
from django.contrib import admin
from .models import Userinfo
admin.site.register(Userinfo)
INSTALLED_APP in setting.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'userinfo',
'rest_framework',
'phonenumber_field',
'books_details',
]
Migrations
from django.db import migrations, models
import userinfo.models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Userinfo',
fields=[
('user_name', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)),
('full_name', models.CharField(max_length=50)),
('user_email', models.EmailField(max_length=254)),
('college_name', models.CharField(max_length=50)),
('city', models.CharField(max_length=50)),
('country', models.CharField(max_length=50)),
('profile_img', models.ImageField(blank=True, upload_to=userinfo.models.upload_rename)),
('varified_user', models.BooleanField(default=False)),
],
),
]
Here are some images i think you should see
I don't know why it says create model userinfo as it was pre-existing
Database screenshot
please any can help with this???
i guess you need first to run makemigrations command:
python manage.py makemigrations userinfo
and then run migrate command:
python manage.py migrate
refer to this tuto from django docx :https://docs.djangoproject.com/en/3.1/intro/tutorial02/#activating-models for more explanations
By running makemigrations, you’re telling Django that you’ve made some changes to your models (in this case, you’ve made new ones) and that you’d like the changes to be stored as a migration.
Update
in some cases, it's better to restart the migration process from scratch just to unlock such situation
so, since you're in development mode i would suggest you deleting:
the database (or better make a backup)
migrations files under migrations folder for each app
and don't forget __pycache__ folders
and then rerun makemigrations and migrate commands respectively

The command migration did not execute

I have a challenge here. I am currently building an application,and I tried to add my app to the settings,in this way :
INSTALLED_APPS = [
'polls.apps.PollsConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
In the model,here is the code :
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
Initially I used this command in the terminal
cd myproject
manage.py migratrate
Here is the output: Apply all migrations: admin,auth,contenttypes,sessions
Running
migrations:No migrations to apply.
Having defined my database in the model,I used the following command.Please,how do I fix this?
Note that I am a beginner in Python and Django
Please check that the polls/migrations/__init__.py file and directory exists. If the polls app is registered correctly in INSTALLED_APPS and the model is registered correctly but the migration file is not created, the next thing to check is to check if the migration directory is normal. Django checks if the __init__.py file exists in the migrations folder, so if it doesn't exist, it won't generate a migration file.
the polls app without polls/migrations/__init__.py:
the polls app with polls/migrations/__init__.py:

Django 3 OperationalError: no such table 'web_user'

I want to have 2 types of users in my Django app, so I followed this tutorial and ran
python manage.py makemigrations web
python manage.py migrate
('web' is the name of my app)
Now I want to access the admin part of the site, automatically added by django at localhost:PORT/admin. When I try to access that page, this error shows:
django.db.utils.OperationalError: no such table: web_user
Here's my models.py:
from django.contrib.auth.models import AbstractUser
from django.db import models
from web import constants
class User(AbstractUser):
USER_TYPE_CHOICES = (
(constants.USER_TYPE_CLEANER, 'cleaner'),
(constants.USER_TYPE_CONTRACTOR, 'contractor'),
)
user_type = models.PositiveSmallIntegerField(choices=USER_TYPE_CHOICES)
# extra fields
email = models.CharField(max_length=100)
phone_number = models.CharField(max_length=15)
date_of_birth = models.DateField('date_of_birth')
address = models.CharField(max_length=50)
city = models.CharField(max_length=25)
state = models.CharField(max_length=25)
and set this in settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'web.apps.WebConfig',
]
# Authentication
AUTH_USER_MODEL = 'web.User'
How can I enable django's admin site? It's very useful for creating demo data.
make sure that before running makemigrations and migrate, add your app name in INSTALLED_APPS in project settings
Thanks to #bmons , the answer was to delete database db.sqlite3, migration files, and create a new user. Note that the extra fields must be nullable, otherwise creating a superuser will fail.

Can Django Tenant Schema work with Django Rest Framework?

I am creating a SaaS app with Django, Django Tenant Schema and Django Rest Framework. Everything works fine without an API but I have issues with sending a get request to different Tenants via an API call. It returns users from all the tenants in the database even if I specify the subdomain.
However, a get request to a none API endpoint works fine, in fact, everything done outside the API endpoint works great.
For Example:
http://goldlimited.localhost:8000/dashboard/api/users
Returns the same information as
http://missinglinkgm.localhost:8000/dashboard/api/users
The view is a basic ModelViewSet
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.filter()
serializer_class = UserSerializer
And the Serializer
class UserSerializer(ModelSerializer):
class Meta:
model = User
exclude = ("password",)
And Route
router = routers.DefaultRouter()
router.register('user', UserViewSet, 'user')
I am wondering if there is a configuration I am missing to make DRF work with Django Tenant Schema.
Yes it does work, little bit of tweaking to settings.py would work. Make sure you add rest_framework to INSTALLED, TENANT APPS.
SHARED_APPS = [
'tenant_schemas',
'Client',
'django.contrib.contenttypes',
# include below if you need admin panel on main site(public schema)
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.sessions',
'django.contrib.messages',
# include other apps here
# 'rest_framework' # if needed or if you're handling auth
]
TENANT_APPS = [
'django.contrib.contenttypes',
# include below if you need admin panel on every tenant
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.sessions',
'django.contrib.messages',
# include other apps here
'rest_framework', # mandatory
]

django.db.utils.IntegrityError in Custom UserModel

Custom User Model:
class User(AbstractBaseUser):
id = models.AutoField(primary_key=True)
username = models.CharField(max_length=30)
email = models.EmailField(unique=True,max_length=75)
test = models.CharField(max_length=20)
USERNAME_FIELD = 'email'
class Meta:
managed = False
db_table = 'auth_user'
On running ./manage.py migrate, I get the following error:
django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')
SHOW ENGINE INNODB STATUS on mysql shows:
2015-07-12 19:29:25 133f4a000 Error in foreign key constraint of table edutraffic/#sql-55ea_17a:
FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`):
Cannot resolve table name close to:
(`id`)
So, I deleted the complete database and recreated it, still getting the same error.
settings.py file:
AUTH_USER_MODEL = 'users.User'
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.staticfiles',
'django.contrib.sites',
'rest_framework',
'rest_framework.authtoken',
'rest_auth',
'allauth',
'allauth.account',
'rest_auth.registration',
'allauth.socialaccount',
'allauth.socialaccount.providers.facebook',
'allauth.socialaccount.providers.google',
'users',
)
You have set managed to False, which means that Django will not create the table. Either remove that line, or create the table manually.

Categories

Resources