Reputation:
I have a little problem on django rest framework in saving data (with token), why i am receiving this error? insert or update on table "authtoken_token" violates foreign key constraint "authtoken_token_user_id_35299eff_fk_auth_user_id" thanks in advance.
this is my serializers.py
class RegistrationSerializer(serializers.ModelSerializer):
password2 = serializers.CharField(style={'input_type': 'password'}, write_only=True)
class Meta:
model = Account
fields = ['email', 'username', 'password', 'password2']
extra_kwargs = {
'password': {'write_only': True},
}
def save(self):
account = Account(
email=self.validated_data['email'],
username=self.validated_data['username']
)
password = self.validated_data['password']
password2 = self.validated_data['password2']
if password != password2:
raise serializers.ValidationError({'password': 'Passwords must match.'})
account.set_password(password)
account.save()
return account
my views.py
@api_view(['POST', ])
def registration_view(request):
if request.method == 'POST':
serializer = RegistrationSerializer(data=request.data)
data = {}
if serializer.is_valid():
account = serializer.save()
data['response'] = 'successfully registered new user.'
data['email'] = account.email
data['username'] = account.username
token = Token.objects.get(user=account).key
data['token'] = token
else:
data = serializer.errors
return Response(data)
my models.py
class MyAccountManager(BaseUserManager):
def create_user(self, email, username, password=None):
if not email:
raise ValueError('Users must have an email address')
if not username:
raise ValueError('Users must have a username')
user = self.model(
email=self.normalize_email(email),
username=username,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, username, password):
user = self.create_user(
email=self.normalize_email(email),
password=password,
username=username,
)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Account(AbstractBaseUser):
email = models.EmailField(verbose_name="email", max_length=60, unique=True)
username = models.CharField(max_length=30, unique=True)
date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = MyAccountManager()
def __str__(self):
return self.email
# For checking permissions. to keep it simple all admin have ALL permissons
def has_perm(self, perm, obj=None):
return self.is_admin
# Does this user have permission to view this app? (ALWAYS YES FOR SIMPLICITY)
def has_module_perms(self, app_label):
return True
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
this is the full traceback
Traceback:
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
84. return self.cursor.execute(sql, params)
The above exception (insert or update on table "authtoken_token" violates foreign key constraint "authtoken_token_user_id_35299eff_fk_auth_user_id"
DETAIL: Key (user_id)=(7) is not present in table "auth_user".
) was the direct cause of the following exception:
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/views/generic/base.py" in view
71. return self.dispatch(request, *args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
505. response = self.handle_exception(exc)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
465. self.raise_uncaught_exception(exc)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/rest_framework/views.py" in raise_uncaught_exception
476. raise exc
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
502. response = handler(request, *args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/rest_framework/decorators.py" in handler
50. return func(*args, **kwargs)
File "/home/schoolsite/schoolsitedir/homepage/api/views.py" in registration_view
27. account = serializer.save()
File "/home/schoolsite/schoolsitedir/homepage/api/serializers.py" in save
34. account.save()
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/contrib/auth/base_user.py" in save
66. super().save(*args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/base.py" in save
741. force_update=force_update, update_fields=update_fields)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/base.py" in save_base
790. update_fields=update_fields, raw=raw, using=using,
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/dispatch/dispatcher.py" in send
175. for receiver in self._live_receivers(sender)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/dispatch/dispatcher.py" in <listcomp>
175. for receiver in self._live_receivers(sender)
File "/home/schoolsite/schoolsitedir/homepage/models.py" in create_auth_token
86. Token.objects.create(user=instance)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/query.py" in create
422. obj.save(force_insert=True, using=self.db)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/rest_framework/authtoken/models.py" in save
33. return super().save(*args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/base.py" in save
741. force_update=force_update, update_fields=update_fields)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/base.py" in save_base
779. force_update, using, update_fields,
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/base.py" in _save_table
870. result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/base.py" in _do_insert
908. using=using, raw=raw)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/query.py" in _insert
1186. return query.get_compiler(using=using).execute_sql(return_id)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/models/sql/compiler.py" in execute_sql
1335. cursor.execute(sql, params)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/backends/utils.py" in execute
99. return super().execute(sql, params)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/backends/utils.py" in execute
67. return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute_with_wrappers
76. return executor(sql, params, many, context)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
84. return self.cursor.execute(sql, params)
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/utils.py" in __exit__
89. raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/schoolsite/schoolsitedir/env/lib/python3.6/site-packages/django/db/backends/utils.py" in _execute
84. return self.cursor.execute(sql, params)
Exception Type: IntegrityError at /api/registration_view/
Exception Value: insert or update on table "authtoken_token" violates foreign key constraint "authtoken_token_user_id_35299eff_fk_auth_user_id"
DETAIL: Key (user_id)=(7) is not present in table "auth_user".
here is my settings.py
INSTALLED_APPS = [
'django_tables2',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
'rest_framework',
'rest_framework.authtoken',
'homepage',
]
AUTH_USER_MODEL = 'homepage.Account'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
]
}
this is my filetree
my file
myproject
|_homepage
|_ __init__.py
|_admin.py
|_models.py
|_apps.py
|_views.py
|_schoolsite
|_ __init__.py
|_settings.y
|_urls.py
|_wsgi.py
Upvotes: 3
Views: 2905
Reputation: 809
WARNING! Migrate "zero" drop all tokens!
Works for me
./manage.py migrate authtoken zero
and then
./manage.py migrate authtoken
Upvotes: 0
Reputation: 1181
For some reason in your db structure auth_user
is still set as ForeignKey
. As you are using Account
as your user model, it should be something like account_user
it might be some migration problem. My best guess is that you had a previous user model(default one may be) and in mid project you created/migrated your new user model (Account
). There may be old data present in your db. If that's the case, I think quickest solution would be to remove all the migration from Account
app and migrate again (to let django create all the db from scratch)
note: of course this means, you have to delete all the current users.
Upvotes: 3