I receive an error while migrating my models to a database

I get such an error while migrating to a database:

 return Database.Cursor.execute(self, query)
 django.db.utils.OperationalError: foreign key mismatch - "user_auth_customer" 
 referencing "user_auth_profile"

I have checked Foreign_Keys of my models and they look good.

I have no idea why I receive that error :(

Please, help me out here.

class Customer(AbstractUser):

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username']
objects = UserManager()

id = models.UUIDField(default=uuid.uuid4,  unique=True, primary_key=True, editable=False)

profile = models.OneToOneField("Profile", related_name="user_profile",
                               on_delete=models.CASCADE, null=True)
first_name = models.CharField(max_length=50, null=True, blank=True)
last_name = models.CharField(max_length=50, null=True, blank=True)
username = models.CharField(max_length=30, null=True, blank=True)
phone = models.CharField(max_length=10, default='', null=True,  blank=True)
email = models.EmailField(validators=[validators.EmailValidator()],
                          unique=True)
password = models.CharField(max_length=100, null=True, blank=True)
date_created = models.DateTimeField(auto_now_add=True)

@staticmethod
def get_customer_by_email(email):
    try:
        return Customer.objects.get(email=email)
    except:
        return False

def isExists(self):
    if Customer.objects.filter(email=self.email):
        return True

    return False

class Meta:
    verbose_name = 'Customer'
    verbose_name_plural = 'Customers'

class Profile(models.Model):

first_name = models.CharField(max_length=50, null=True, blank=True)
last_name = models.CharField(max_length=50, null=True, blank=True)
phone = models.CharField(max_length=10, default='', null=True, blank=True)
email = models.EmailField(primary_key=True, unique=True, validators=[validators.EmailValidator()])
password = models.CharField(max_length=100, null=True, blank=True)
# Add a photo field
owner = models.OneToOneField(Customer, related_name='profile_owner',
                             on_delete=models.SET_NULL, null=True)
username = models.CharField(max_length=30, null=True, blank=True,
                            validators=[UnicodeUsernameValidator()])
date_created = models.DateTimeField(auto_now_add=True)

class Meta:
    verbose_name = 'Profile'
    verbose_name_plural = 'Profiles'

if you need any else details, I can provide you with those in the comments.

You can't have both ways OneToOneField. Choose one way.

If you delete Customer's profile field, then still you will have possibility to call relation with:

customer = Customer.objects.get(id=1)
customer.profile   # that will call Customer's related Profile object

Assuming, that you will change related_name='profile_owner' to simpler related_name='profile'.

Read more about OneToOneRelationships.

Back to Top