Home > database >  Django ID of foreign key doesn't exist after migrating
Django ID of foreign key doesn't exist after migrating

Time:03-19

I'm new to Django, and I'm trying to create a "game" model with two attributes:

  • A many-to-one field where multiple instances of the game model are associated with an instance of a custom user model.
  • A many-to-many field where instances of the game model are connected with multiple instances of words, and instances of the word model are connected with multiple instances of the game model

Game model:

class SortingGame(models.Model):
    user_current_player = models.ForeignKey(CustomUser, on_delete=models.CASCADE, null=True, blank=True)
    field_words = models.ManyToManyField(Word, related_name="field_sorting_games")

Word model:

class Word(models.Model):
    str_word = models.CharField(max_length=50,null=True)
    int_grade_level = models.IntegerField()
    arrint_phonemes = ArrayField(models.CharField(max_length=50),null=True)
    arrstr_graphemes = ArrayField(models.CharField(max_length=50),null=True)
    int_num_syllables = models.IntegerField()
    arrstr_syllables = ArrayField(models.CharField(max_length=50),null=True)

User model:

class CustomUser(AbstractBaseUser):
    # must have the following fields for django
    email = models.EmailField(verbose_name="email",max_length = 100,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_superuser = models.BooleanField(default = False)
    is_staff = models.BooleanField(default = False)
    is_active = models.BooleanField(default = True)
    first_name = models.CharField(max_length=15, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    spelling_level = models.IntegerField(default=1, unique=False)
    time_played = models.IntegerField(default=0, unique=False)
    percent_correct = models.IntegerField(default=0, unique=False)

When I run python3 manage.py makemigrations and python3 manage.py migrate, it doesn't complain, but when I go to the admin page of my django site it says psycopg2.errors.UndefinedColumn: column "user_current_player_id" of relation "game_sortinggame" does not exist.

This makes me think the issue is with user_current_player in SortingGame (it worked fine before I added that attribute), but I've looked around on different forums to see what might be going wrong and I can't seem to figure it out. I tried starting from scratch with a new database, and it's still throwing the same exception. Any ideas would be appreciated—thanks!

CodePudding user response:

Nathan! First thing would be make sure that you have the app where CustomUser model is created in your settings.py file, at INSTALLED_APPS. If so, please have a look at this folder (app) where you have CustomUser defined to verify if there is in deed a migrations folder there.

I suspect that Django in not aware of this app (not under INSTALLED_APPS) and therefore did not migrated it. So, your database is not finding the User Model connection.

That said, I would suggested you to keep your account model as defined by Django User and create another model with a direct relationship to it to deal with profile/game fields such as spelling level, percentage_correct and so on.

This would keep your Model "concerns" more organized later on.

CodePudding user response:

if you did make a migrations before try to use (python manage.py makemigrations -appname)

Also after That you need to Add the module in your admin.py

from django.contrib import admin
from .models import *

admin.site.register(SortingGame)
... all other modules
  • Related