0

私はそのようなコードを持っています。socialid保存後にテーブルに行が作成されますが、とに値を割り当てるにはどうすればよいaccesstokenですか?

class Appuser(models.Model):
user = models.OneToOneField(User)
socialid = models.IntegerField(null=True)
accesstoken = models.CharField(max_length=255L, null = True)
class Meta:
    db_table = 'AppUser'
def __str__(self):  
      return "%s's profile" % self.user  

@receiver(post_save, sender=User)
def create_cfituser(sender, instance, created, **kwargs):  
    if created:  
        Appuser.objects.get_or_create(user=instance)  

これをシェルで実行すると、次のようになります。

>>> user = User.objects.create_user('John Doe')
>>> appuser = Appuser(user = user,accesstoken = '634646473', socialid='6436') 
>>> appuser.save()
"Duplicate entry '9' for key 'user_id'"

その行はすでに存在するため、これは理にかなっています。おそらく私が見逃しているのは簡単なことなので、どんな助けでも大歓迎です。

4

1 に答える 1

1

代わりに User モデルを直接拡張できるため、OneToOne で別のモデルを使用することは推奨されなくなりました。とはいえ、ここで間違っているのは、シグナルが Appuser を作成しているのに、別の Appuser を作成しようとしているということです。代わりに、シグナルによって作成されたものを取得します。

user = User.objects.create_user('John Doe')
appuser = Appuser.objects.get(user=user)
appuser.accesstoken = '634646473'
appuser.socialid = 6436
appuser.save()

通常は を実行するだけでusertoから取得できますが、ユーザーを取得した時点で appuser が存在しなかったため、この時点ではおそらく機能しないことに注意してください。次にデータベースから Appuser または User を取得すると、直接参照が機能します。appuseruser.appuser

于 2013-08-27T11:52:58.737 に答える