Django Rest Framework - 无法使用现有的FK引用创建对象

Dar*_*ech 2 django-rest-framework

我在DRF中有一个序列化程序类,如下所示:

class ProjectSerializer(serializers.HyperlinkedModelSerializer):
    created_by = UserSerializer() # created_by is an FK to User model

    class Meta:
        model = Project
        fields = ('id', 'title', 'created_by')
Run Code Online (Sandbox Code Playgroud)

我的观点:

class ProjectList(generics.ListCreateAPIView):
    model = Project
    serializer_class = ProjectSerializer
    filter_fields = ('title',)

    def post(self, request, format=None):
        serializer = ProjectSerializer(data={
            "id": 12, 
            "title": "FooBar's Project", 
            "created_by": {
                "id": 1, 
                "username": "foobar", 
                "first_name": "foo", 
                "last_name": "bar",
            },
        })

    if serializer.is_valid():
        serializer.save()
    else:
        print serializer.errors
    return Response(serializer.data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)

除了DRF抱怨说:

{'created_by': [{'username': [u'User with this Username already exists.']}]}
Run Code Online (Sandbox Code Playgroud)

我想要的是项目是参考现有用户创建的.我在这做错了什么?

注意:我正在跟踪DRF的主干,而不是来自cheeseshop.

jbu*_*bub 6

如果要分配现有用户而不是创建一个用户,则嵌套序列化程序不是这样.由于您只想将关系添加到用户,您需要查看关系.

PrimaryKeyRelatedField是要走的路,因为这个字段是可写的,你还需要传递一个queryset属性.

created_by = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
Run Code Online (Sandbox Code Playgroud)

请参阅文档以检查可以传递给此字段的其他选项:

http://django-rest-framework.org/api-guide/relations#primarykeyrelatedfield

然后您的示例帖子可能如下所示:

def post(self, request, format=None):
    user = User.objects.get(pk=8)
    serializer = ProjectSerializer(data={
        "id": 12, 
        "title": "FooBar's Project", 
        "created_by": user.pk,
    })
Run Code Online (Sandbox Code Playgroud)

  • 一个额外的问题 - 有没有办法仍然使用Project API返回由数据创建的完整内容?切换到`PrimaryKeyRelatedField`后,我现在只在`created_by`字段中返回用户的'pk`.理想情况下,我仍然希望在此字段中将`username`,`firstname`和`lastname`作为字符串返回. (2认同)