【问题标题】:Django REST framework: Create/Update object using Related FieldDjango REST 框架:使用相关字段创建/更新对象
【发布时间】:2014-07-07 19:34:39
【问题描述】:

我有两个模型

验证用户模型和用户配置文件

class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile')
    name = models.CharField(_lazy(u'Name'), max_length=255)

我正在使用这些序列化程序:

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

from oneanddone.users.models import UserProfile

    class UserProfileSerializer(serializers.ModelSerializer):

        class Meta:
            model = UserProfile
            fields = ('name',)


    class UserSerializer(serializers.ModelSerializer):
        profile = serializers.RelatedField()

        class Meta:
            model = User
            fields = ('id', 'username', 'email', 'groups', 'profile')

但是在发出帖子请求时

requests.post('http://localhost:8000/api/v1/users/', data={"username": "tester", "email": "tester@gmail.com", "profile": [{"name":"testername"}]} ,headers={'Authorization':'Token d81e33c57b2d9471f4d6849bab3cb233b3b30468'}).text

我得到以下带有“空”配置文件字段的对象

u'{"id": 10, "username": "tester", "email": "tester@gmail.com", "groups": [], "profile": null}'

我无法弄清楚如何创建和更新用户配置文件名称以及验证用户数据。 请让我知道如何执行此操作并提供一些示例。

【问题讨论】:

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


    【解决方案1】:

    Django REST Framework 当前不支持嵌套写入,因此您必须通过在 ListCreateAPIView 中覆盖 create 来创建 UserProfile:

    class UserList(generics.ListCreateAPIView):
        model = User
        serializer_class = UserSerializer
    
        def create(self, request, *args, **kwargs):
            data = request.DATA
    
            # note: transaction.atomic was introduced in Django 1.6
            with transaction.atomic():
                user = User.(
                    username=data['username'],
                    ...
                )
                user.clean()
                user.save()
    
                UserProfile.objects.create(
                    user=user,
                    name=data['profile']['name']
                )
    
            serializer = UserSerializer(user)
            headers = self.get_success_headers(serializer.data)
    
            return Response(serializer.data, status=status.HTTP_201_CREATED,
                            headers=headers)
    

    如果配置文件没有成功保存,使用transaction.atomic 将回滚用户创建。

    编辑

    如果您要创建新用户,您可能希望使用create_user method。上面的代码旨在展示在一个 REST API POST 请求中创建模型实例和相关记录的一般情况。

    【讨论】:

      【解决方案2】:

      实际上 Django Rest Framework 有部分嵌套支持。如果您查看测试套件,您会发现一些。 至于 bitgeeky 问题,正如 IRC 上所说,这应该有效。这是一个相关的测试用例: https://github.com/tomchristie/django-rest-framework/blob/2.3.13/rest_framework/tests/test_relations_nested.py#L56

      考虑到这一点,我想我曾经遇到过这个错误。 @bitgeeky 您可以通过在标头中添加内容类型来确保发送 json 请求吗? 默认情况下,帖子将使用不支持嵌套的表单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-04
        • 2014-04-03
        • 2013-03-06
        • 1970-01-01
        • 2016-04-23
        • 2023-03-30
        • 2018-09-02
        相关资源
        最近更新 更多