模型不保存刷新令牌

Model not saving refresh token

只是试图将刷新令牌从 Google OAuth 2.0 保存到登录的抽象用户配置文件中。 它正确显示刷新令牌和用户。但是,当登录时,用户没有在模型中存储刷新令牌。

pipeline.py:

from .models import Profile
def save_token(user,*args,**kwargs):
    extra_data = user.social_auth.get(provider="google-oauth2").extra_data
    print(extra_data["refresh_token"],user)
    Profile.objects.get_or_create(
        username=user, defaults={"refresh_token": extra_data["refresh_token"]}
    )

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class Profile(AbstractUser):
    refresh_token = models.CharField(max_length=255, default="")

 

现在显示的时候是空的

calendar.html:

{% block content %}
   
    {{user.refresh_token}}
    
    <h1>Calendar</h1>
    <button>+</button>
    <ul>
        {% for result in results %}
            <li>{{result.start.date}}{% if result.end.date %}-{% endif%}{{result.end.date}}: {{result.summary}}</li>
        {% endfor %}
    </ul>
{% endblock %}

queryset 方法 get_or_create 不会更新模型中的值,它只会在对象不存在时创建一个新对象。如果您尝试更新 existing 对象中的值,您应该使用 get_or_create returns 的第二个值来确认它已经存在并进行必要的更新.

所以调整应该是这样的:

def save_token(user,*args,**kwargs):
    extra_data = user.social_auth.get(provider="google-oauth2").extra_data

    profile, created = Profile.objects.get_or_create(
        username=user, defaults={"refresh_token": 
        extra_data["refresh_token"]}
    )

    # `created` will be false if the object exists

    if not created:
        profile.refresh_token = extra_data["refresh_token"]
        profile.save()