【问题标题】:Can't POST after extending User model fields in Django REST在 Django REST 中扩展用户模型字段后无法发布
【发布时间】:2015-04-17 14:59:05
【问题描述】:

我能够扩展用户模型字段,并且我可以看到带有这些字段和输入的 API 浏览器,但是当我尝试发布新用户时出现此错误:

'signup' is an invalid keyword argument for this function

或者如果我更改了 serializers.py

User.objects.create(**validated_data) 

SignUp.objects.create(**validated_data)

我明白了

'username' is an invalid keyword argument for this function

serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User


class UserSerializer(serializers.ModelSerializer):
    city = serializers.CharField(source='signup.city')

    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name', 'city')

    def create(self, validated_data):
        return User.objects.create(**validated_data)

models.py

from django.contrib.gis.db import models
from django.contrib.auth.models import User

class SignUp(models.Model):
    user=models.OneToOneField(User, primary_key=True)
    city = models.CharField(max_length=50, blank=True)

    def __unicode__(self):
        return self.first_name

【问题讨论】:

    标签: django api rest django-rest-framework


    【解决方案1】:

    您需要通过模型中的related_name field 执行此操作,然后您可以在序列化程序上引用它。

    class SignUp(models.Model):
        user=models.OneToOneField(User, primary_key=True, related_name='signup') # <---
    

    我认为您不能将嵌套字段展平到父模型的序列化程序中。

    你可以做一个嵌套字段:

    class UserSerializer(serializers.ModelSerializer):
        city = serializers.CharField(source='signup')
    

    如果您通过 JSON 路径访问它,您将获得如下对象:

    {
        url: "localhost:8000/users/1",
        username: "foo",
        email: "foo@example.com",
        signup: {
            city: "Seattle"
        }
     }
    

    【讨论】:

    • 我创建了 AbstractUser 以在一张表上扩展自定义用户模型。现在一切正常,我没有嵌套字段。
    猜你喜欢
    • 2021-08-25
    • 2017-08-07
    • 1970-01-01
    • 2017-10-20
    • 2012-10-02
    • 2011-02-22
    • 2016-11-09
    相关资源
    最近更新 更多