django rest框架-在不更改现有代码的情况下扩展auth.user

Ofe*_*mon 0 django foreign-keys extending django-rest-framework

我正在django rest框架中工作,并构建一个RESTful api从Android应用程序访问。

我想扩展用户模型并添加电话号码字段-但我有带有外键的模型到用户模型以及基于令牌的身份验证。

例如:

class Ride(models.Model):
    driver = models.ForeignKey('auth.User')
    destination=models.ForeignKey(Destination)
Run Code Online (Sandbox Code Playgroud)

显然我有默认的用户表,正如我所说的-令牌身份验证-(在注册时生成令牌,然后客户端登录 -发送用户名:密码并获得令牌登录)。

我的问题是:

如何在最小代码/模型/视图更改的情况下以最佳方式向用户添加此字段?我读了很多有关此主题的答案,只是想使用最佳选择。

------------编辑--------------

添加UserProfile之后,我在创建用户时遇到了麻烦,下面是代码:

serializers.py:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'username', 'first_name', 'last_name', 'password', )
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        user = User(
            first_name=validated_data['first_name'],
            username=validated_data['username'],
            last_name=validated_data['last_name']
        )

        user.set_password(validated_data['password'])
        user.save()
        user.UserProfile.phone_number = self.initial_data["phone_number"]
        return user
Run Code Online (Sandbox Code Playgroud)

型号

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone_number = models.CharField(max_length=15)

@receiver(post_save, sender=User)
def handle_user_save(sender, instance=None, created=False, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
        Token.objects.create(user=instance)
Run Code Online (Sandbox Code Playgroud)

user.save()调用handle_user_save方法-然后我创建用户配置。

问题是-创建它之后-我无法从用户那里更新它的字段。问题在这一行:

user.UserProfile.phone_number = self.initial_data["phone_number"]
Run Code Online (Sandbox Code Playgroud)

它将引发异常-“用户没有字段UserProfile”。

我应该怎么做?

谢谢

Ada*_*m_O 5

提到的OneToOne字段很可能是Django建议的扩展现有用户模型的方法

建议您创建一个新模型,例如UserProfile,然后在其中添加所需的任何新字段。UserProfile将使用OneToOne字段链接到用户模型。

from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    new_field = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

来自其他模型的所有外键引用仍应指向Django的用户模型。当您需要添加的新字段时,只需从用户中提取配置文件即可:

user = Users.objects.get(username='example')
print user.userprofile.new_field
Run Code Online (Sandbox Code Playgroud)