我想用外鍵request.user
創建一個SpiderService
。django-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對象。
如何解決?
你是對的,謝謝!但有沒有另一種方式來自動填充用戶字段?在刪除user = serializers.ReadOnlyField(source ='user.id')'後,它說''user''是必需的。 – Mithril
我沒有得到你的評論 – Linovia
你說我的用戶字段是'read_only',所以我刪除它。然後發生驗證錯誤,說「用戶」是必需的。這是否意味着我必須自己保存一個外鍵? – Mithril