Rizhiy
Rizhiy

Reputation: 854

Extending a model in Django

I am trying to create a custom user model. This model has to extend another model and also link to built-in django User. Currently I have:

class Entity(models.Model):
    name = models.CharField(max_length=256, null=True, blank=True)

class Profile(Entity):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    instance.profile.save()

But when I try to create a user I get an error: UNIQUE constraint failed: project_profile.entity_ptr_id.

Do I need to add another function to create entity first? Or should I structure my models in another way?

Upvotes: 0

Views: 53

Answers (2)

Cadmus
Cadmus

Reputation: 665

if you creating the Profile instance with User it already saved in the database if you use create method. you don't need to save seperatly. ie the following signls is enough for saving and creating user profile instance

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

Upvotes: 1

mta194
mta194

Reputation: 532

The OneToOne relation means that you can have only one profile per user.

Modify the code to

class Profile(Entity):
   user = models.ForeignKey(User, on_delete=models.CASCADE)

Upvotes: 0

Related Questions