2017-10-08 81 views
-1

我想用'Profile'模型擴展'User'模型。爲了促進這一點,我創建了以下模型。我想用每個新的「用戶」模型自動創建鏈接的「配置文件」模型。基於互聯網(simpleisbetterthancomplex)我想出了以下解決方案上計算器/研究的一些評論:Django OneToOneField post_save無法調用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() 

然而,我每次運行這個(無論是通過單元測試或者「創建超級用戶」 - 我沒有搶答但我正在練習TDD)我得到以下錯誤:

TypeError: 'int' object is not callable 

有沒有人知道我在做什麼錯?

編輯:我已經提供了是「創建超級用戶」命令後顯示

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

我們無法知道,除非你提供完整的回溯。 –

+0

感謝您的答覆,我已經添加了「創建超級用戶」命令後,會出現錯誤信息的完整回溯。 – Jasper

回答

1

您已經定義了一個名爲save場,這是隱藏實際save方法。將它重命名爲其他內容。我不明白你爲什麼需要第二個接收器,但即使你確實需要這個邏輯,你也應該把它放在這裏。在第一個。)

+0

重命名保存變量解決了問題! 謝謝! – Jasper

-1

保持created_user_profilesave_user_profileProfile模型的外面都錯誤信息的回溯。 Unindent吧。

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

也試着改變save

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

感謝您的迴應! 不幸的是,問題仍然存在,即使這些步驟之後。 我已更新我的原始消息,以顯示更多的錯誤消息,它似乎崩潰了INSTANCE變量 – Jasper