2014-03-24 91 views
0

我有一個與用戶(django.contrib.auth.models.User)模型OneToOne關係的自定義模型;Django post_save掛鉤導致syncdb錯誤

class Profile(models.Model): 
    user = models.OneToOneField(User) 

我想創建一個新的配置文件,每次創建一個用戶。所以我添加了一個信號;

@receiver(post_save, sender=User) 
def _setup_user(sender, **kwargs): 
    """ 
    Create a new profile instance for each user 
    """ 
    created = kwargs.get('created', False) 
    user = kwargs.get('instance', False) 
    if created and user: 
     profile = Profile(user=kwargs['instance']) 
     profile.save() 

這一切都很好,創造了管理員用戶時,因爲配置表還尚未創建(我使用的是南來管理遷移),但是執行syncdb拋出一個錯誤。

我該如何解決這個問題?

編輯

所以,省略了創建超級用戶的工作;

$ ./manage.py syncdb --noinput 
$ ./manage.py migrate 
$ ./manage.py createsuperuser 

回答

1

運行執行syncdb第一和衰退作出superuser。然後創建該數據庫運行manage.py createsuperuser

Here's的文檔1.6

如果你已經不再麻煩讓我知道,但如果唯一的問題是,DB是不是先創建的,那麼這應該工作了。

希望它可以幫助

乾杯

1

你可以嘗試這樣的事情:

from django.db import DatabaseError, transaction 

@receiver(post_save, sender=User) 
@transaction.commit_manually 
def _setup_user(sender, **kwargs): 
    """ 
    Create a new profile instance for each user 
    """ 
    created = kwargs.get('created', False) 
    user = kwargs.get('instance', False) 
    if created and user: 
     try: 
      profile = Profile(user=kwargs['instance']) 
      profile.save() 
     except DatabaseError: 
      transaction.rollback() 
     else: 
      transaction.commit() 

根據您的數據庫後端,你可能不需要手工事務管理,但對於psycopg2有必要,否則您會收到「current transaction is aborted」錯誤。

如果採取這種方法,那麼在運行syncdb之後,您需要手動爲超級用戶創建一個配置文件,因此在這種情況下,我認爲TheSpurg's answer更簡單。儘管如此,仍然值得知道如何從DataBaseError中恢復,所以我會發布這個答案。