2017-10-08 6 views
-1

Je souhaite étendre mon modèle 'User' avec le modèle 'Profile'. Pour faciliter cela, j'ai créé le modèle suivant. Je voulais que le modèle 'Profile' lié soit automatiquement créé avec chaque nouveau modèle 'User'. Sur la base des commentaires sur stackoverflow/recherche sur Internet (simpleisbetterthancomplex) Je suis venu avec la solution suivante:Django OneToOneField post_save ne peut pas appeler l'objet int

from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 


# Create your models here. 
class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') 

    #Pushup related stats 
    total_pushups = models.IntegerField(default=0) 
    best_consecutive = models.IntegerField(default=0) 
    week_streak = models.IntegerField(default=0) 
    save = models.IntegerField(default=000) 

    @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() 

Cependant, chaque fois que je cours ce (que ce soit par tests unitaires ou « créer super-utilisateur » - Je n'ai pas EDDV Pourtant, je pratique TDD) Je reçois l'erreur suivante:

TypeError: 'int' object is not callable 

Est-ce que quelqu'un sait ici ce que je fais mal?

Edit: J'ai inclus un retraçage du message d'erreur qui apparaît après la commande « créer super-utilisateur »

Traceback (most recent call last): 
    File "manage.py", line 22, in <module> 
    execute_from_command_line(sys.argv) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line 
    utility.execute() 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/core/management/__init__.py", line 356, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/core/management/base.py", line 283, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 63, in execute 
    return super(Command, self).execute(*args, **options) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/core/management/base.py", line 330, in execute 
    output = self.handle(*args, **options) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 183, in handle 
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/contrib/auth/models.py", line 170, in create_superuser 
    return self._create_user(username, email, password, **extra_fields) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/contrib/auth/models.py", line 153, in _create_user 
    user.save(using=self._db) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/contrib/auth/base_user.py", line 80, in save 
    super(AbstractBaseUser, self).save(*args, **kwargs) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/db/models/base.py", line 807, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/db/models/base.py", line 847, in save_base 
    update_fields=update_fields, raw=raw, using=using, 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/dispatch/dispatcher.py", line 193, in send 
    for receiver in self._live_receivers(sender) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/dispatch/dispatcher.py", line 193, in <listcomp> 
    for receiver in self._live_receivers(sender) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/user_profiles/models.py", line 20, in create_user_profile 
    Profile.objects.create(user=instance) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/db/models/manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/home/jasper/PycharmProjects/PushUpTuneUp/venv/lib/python3.5/site-packages/django/db/models/query.py", line 394, in create 
    obj.save(force_insert=True, using=self.db) 
TypeError: 'int' object is not callable 
+0

Nous ne pouvons pas savoir à moins que vous fournissiez le retraçage complet. –

+0

Merci pour la réponse, j'ai ajouté la trace complète du message d'erreur qui se produit après la commande 'create superuser'. – Jasper

Répondre

1

Vous avez défini un champ appelé save, qui cache la méthode save réelle. Renommez-le en quelque chose d'autre.

(Et pas lié à votre problème, mais vous ne devriez certainement pas avoir deux récepteurs ici, je ne vois pas pourquoi vous avez besoin du second, mais même si vous aviez besoin de cette logique, vous devriez juste le mettre avec le premier.)

+0

Renommer la variable de sauvegarde a résolu le problème! Merci! – Jasper

-1

Conserver created_user_profile et save_user_profile à l'extérieur du modèle Profile. Unindent il.

class UserProfile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE,default=1) 
    . . . . . 
    . . . . . 

| 
| 
| 

@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() 

Essayez également de changer save champ

user_save = models.IntegerField(default=0) 
+0

Merci pour la réponse! Malheureusement, le problème persiste, même après ces étapes. J'ai mis à jour mon message d'origine pour montrer un peu plus du message d'erreur, il semble planter sur la variable INSTANCE – Jasper