2016-02-01 109 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)