【问题标题】:How to retrieve object attributes of an OneToOneField relation in Django-Rest-Framework如何在 Django-Rest-Framework 中检索 OneToOneField 关系的对象属性
【发布时间】:2015-11-22 21:40:35
【问题描述】:

我正在尝试使用 OneToOneField 扩展用户模型,以便可以向用户添加更多字段:

class Userattribs(models.Model):    
    user = models.OneToOneField(User)
    passcode = models.IntegerField(default=0)

    # about user
    organisation = models.CharField(max_length=100, null=True)
    description = models.CharField(max_length=300, null=True)

我还有以下模型序列化器:

class UserattribsSerializer(serializers.ModelSerializer):   
    class Meta:
        model = Userattribs

        fields = ('organisation', 'description')

class UserSerializer(serializers.ModelSerializer):
    userattribs = UserattribsSerializer(required=True)

    class Meta:
        model = User

        fields =('id', 'username', 'first_name', 'last_name', 'email', 'userattribs') 

我遇到的问题是用户的序列化,在 json 响应中不包含“userattribs”。我花了几个小时在谷歌上搜索并敲打我的头。如果你能帮助我,我将永远感激不尽。

提前致谢!

我已添加视图。我注意到的一件奇怪的事情是,当我查询(使用 UserList)所有数据时,我会得到 Userattribs。但是,当我检索单个项目时,我没有得到 Userattribs

###################################################
### Views #########################################
###################################################
class UserList(generics.ListCreateAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (permissions.AllowAny,)

class UserDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    permission_classes = (access_permission,)

【问题讨论】:

  • 请添加您的urls.pyUserDetailview 的输出。这个access_permission 变量是什么?注释 permission_classes 以进行调试

标签: python django django-models django-rest-framework


【解决方案1】:

我在您的代码中没有看到任何错误。你确定你的User 对象有一个Userattribs 对象吗?

python manage.py shell打开你的python shell并输入这个来测试你的代码:

#import your related models and serializer
from your_app.models import *
from your_app.serializer import *
# create new user
user = User.objects.create(username="test")
# create new user attrib linked to `user` object
user_attrib = Userattribs.objects.create(user=user, organisation="DJANGO")
# serialize your `user` object
user_serializer = UserSerializer(user)
# display your serialized data
user_serializer.data
# outputs : {'last_name': '', 'userattribs': OrderedDict([('organisation', 'DJANGO'), ('description', None)]), 'email': '', 'username': 'test', 'first_name': '', 'id': 3}

如果没问题,问题可能来自你的观点。

【讨论】:

  • 非常感谢 Louis 的回复。我按照指示做了,这一切似乎都有效:/我怀疑这可能与序列化程序有关,但它看起来对我来说是正确的。 class UserDetail(generics.RetrieveUpdateDestroyAPIView): queryset = User.objects.all() serializer_class= UserSerializer permission_classes = (access_permission,)
  • 欢迎您。 :) 请在您的问题中添加您的观点。
  • 感谢您帮助路易斯。我已经用我的观点更新了帖子
猜你喜欢
  • 2017-03-07
  • 2018-08-14
  • 2018-01-15
  • 1970-01-01
  • 2015-10-15
  • 2019-04-30
  • 2017-03-04
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多