2016-02-01 57 views
1

我想用外键request.user创建一个SpiderServicedjango-rest-framework反序列化请求创建一个用户外键的对象

型号:

from django.contrib.auth.models import User 

class SpiderService(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=20) 

串行:

class SpiderServiceSerializer(serializers.ModelSerializer): 
    user = serializers.ReadOnlyField(source='user.id') 

    class Meta: 
     model = SpiderService 
     fields = ('id', 'user', 'name') 

class SpiderServiceListSerializer(viewsets.ModelViewSet): 
    queryset = SpiderService.objects.all() 
    serializer_class = SpiderService 

观点:

class SpiderServiceList(APIView): 

    def get(self, request, format=None): 
     services = SpiderService.objects.all() 
     serializer = SpiderServiceSerializer(services, many=True) 
     return Response(serializer.data) 

    def post(self, request, format=None): 
     serializer = SpiderServiceSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def perform_create(elf, serializer): 
     serializer.save(user=self.request.user) 

发帖时

{ 
    "name": "2" 
} 

的API URL,得到500错误:

[01/Feb/2016 15:39:55] "POST /services/ HTTP/1.1" 500 17105 
IntegrityError: NOT NULL constraint failed: spmanage_spiderservice.user_id 

我已阅读Serializer relations,发现我不应该写代码如上。官方示例等于在SpiderServiceSerializer中删除user field,并将spiderservice field添加到UserSerializer。示例旨在在django模型中实现类似user.spiderservice_set的语法,这不符合我的目的。

我只想创建一个带有request.user的spiderservice对象。

如何解决?

回答

2

您需要将当前用户添加为extra parameter to the Serializer's save method

serializer.save(user=request.user) 
+0

你是对的,谢谢!但有没有另一种方式来自动填充用户字段?在删除user = serializers.ReadOnlyField(source ='user.id')'后,它说''user''是必需的。 – Mithril

+0

我没有得到你的评论 – Linovia

+0

你说我的用户字段是'read_only',所以我删除它。然后发生验证错误,说“用户”是必需的。这是否意味着我必须自己保存一个外键? – Mithril

0

你对用户模型的任何帐户串行?
如果是这样,在你SpiderServiceSerializer试试这个:

user = AccountSerializer(read_only=True, required=False)