【问题标题】:Missing field in a Django User custom modelDjango 用户自定义模型中缺少字段
【发布时间】:2017-03-31 07:39:48
【问题描述】:

在 Django REST 中尝试使用经典序列化程序后,我目前正在尝试使用自定义模型,即我的模型有一个 OneToOneField 字段。

我的模型(models.py)是自定义的User

class Friend2(models.Model):
    user = models.OneToOneField(User)
    add_field = models.CharField(max_length=15)

我用(基于this SO topic)序列化它(在serializers.py):

class Friend2Serializer(serializers.HyperlinkedModelSerializer):

    add_field = serializers.CharField(source='friend2.add_field')

    class Meta:
        model = User
        fields = ('id', 'username', 'password', 'email', 'add_field')

    def create(self, validated_data):
        profile_data = validated_data.pop('friend2', None)
        user = super(Friend2Serializer, self).create(validated_data)
        self.create_or_update_user(user, profile_data)
        return user

    def update(self, instance, validated_data):
        profile_data = validated_data.pop('friend2', None)
        self.create_or_update_profile(instance, profile_data)
        return super(Friend2Serializer, self).update(instance, validated_data)

    def create_or_update_user(self, user, profile_data):
        profile, created = Friend2.objects.get_or_create(user=user, defaults=profile_data)
        if not created and profile_data is not None:
            super(Friend2Serializer, self).update(profile, profile_data)

要POST数据注册新用户,我使用如下代码sn-p:

import requests
import json

json_data = {'username': 'mylogin12', 'password': 'mypassword', 'email': 'mymail12@wanadoo.fr', 'add_field' : 'myaddfield'}
r = requests.post('http://127.0.0.1:8000/register_new_user', json=json_data)

在我的views.py:

@api_view(['POST'])
def register_new_user(request):

    if request.method == 'POST':
        print('POST request !')

        print(request.data)
        serializer = Friend2Serializer(data=request.data)

        if serializer.is_valid():

            serializer.save()
            print('save friend!')
            return HttpResponse(status.HTTP_201_CREATED)

        else:
            print(serializer.errors)
            return HttpResponse(status.HTTP_403_FORBIDDEN)

到目前为止,它有效。

但是,当我尝试检索所有注册用户时:

def get_all_users(request):

    all_friends = Friend2.objects.all()

    serial = Friend2Serializer(all_friends, many=True)
    json_data = JSONRenderer().render(serial.data)

    return HttpResponse(json_data, content_type='application/json')

我收到以下错误:

Got AttributeError when attempting to get a value for field `username` on serializer `Friend2Serializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Friend2` instance.
Original exception text was: 'Friend2' object has no attribute 'username'.

但我不明白为什么 username 字段不存在它是 User 模型的属性。

编辑:

我尝试根据以下内容修改我的序列化程序:

class Friend2Serializer(serializers.ModelSerializer):

username = serializers.CharField(source='user.username')
password = serializers.CharField(source='user.password')
email = serializers.CharField(source='user.email')
add_field = serializers.CharField(allow_blank=True)

class Meta:
    model = Friend2
    fields = ('username', 'password', 'email', 'add_field')
    depth = 1

def create(self, validated_data):
    profile_data = validated_data.pop('friend2', None)
    user = super(Friend2Serializer, self).create(validated_data)
    self.create_or_update_user(user, profile_data)
    return user

def update(self, instance, validated_data):
    profile_data = validated_data.pop('friend2', None)
    self.create_or_update_profile(instance, profile_data)
    return super(Friend2Serializer, self).update(instance, validated_data)

def create_or_update_user(self, user, profile_data):
    profile, created = Friend2.objects.get_or_create(user=user, defaults=profile_data)
    if not created and profile_data is not None:
        super(Friend2Serializer, self).update(profile, profile_data)

但是现在,我收到以下错误:

raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])

TypeError: 'user' 是此函数的无效关键字参数

【问题讨论】:

  • 您似乎正在将一个对象 Friend2 传递给您的序列化程序,该对象无法正确解释,因为您的 Friend2 模型不具有您的 User 模型具有的属性,例如 username。我知道我说的似乎很明显。我正在想办法解决这个问题...
  • Friend2Serializer 期望 queryset 包含所有字段,但它只有 useradd_field

标签: python django django-rest-framework


【解决方案1】:

Friend2 模型有一个user 字段,而不是username。在您的序列化程序类中将 username 替换为 user

【讨论】:

  • 我完全同意你的观点,我的 Friend2 模型只有 user 和 add_field 作为属性。然而,正如这篇文章中提到的:stackoverflow.com/questions/18517438/…,Django 应该能够“猜测”用户名属性是我的用户模型的一个属性,不是吗?
猜你喜欢
  • 2021-04-15
  • 2011-04-08
  • 1970-01-01
  • 2021-12-08
  • 2011-02-22
  • 1970-01-01
  • 2013-07-02
相关资源
最近更新 更多