NOT NULL约束失败:device_api_devicegroup.owner_id

时间:2017-03-05 05:08:25

标签: python django django-rest-framework

发布群组时,我收到的不是空约束失败错误。我该如何解决?我不想在api中显示用户,所以我没有在序列化器字段中使用它。我是否必须强制将其添加到那里?

这是我的模型,序列化程序和APIView

class DeviceGroup(models.Model):
    token = models.UUIDField(default=uuid.uuid4, unique=True, editable=False)
    name = models.CharField(max_length=250, blank=False, null=False)
    owner = models.ForeignKey(User, blank=False, null=False)


class DeviceGroupSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source='token', format='hex', read_only=True)
    class Meta:
        model = DeviceGroup
        fields = ['id','name']


class DevicesGroupsAPIView(APIView):
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = DeviceGroupSerializer

    def get_object(self, user, token):
        try:
            return BaseDevice.objects.filter(owner=user).get(token=token)
        except ObjectDoesNotExist:
            return error.RequestedResourceNotFound().as_response()

    def get(self, request, format=None):
        """
            Returns a list of groups
        """
        reply = {}
        try:
            groups = DeviceGroup.objects.filter(owner=request.user)
            reply['data'] = DeviceGroupSerializer(groups, many=True).data
        except:
            reply['data'] = []
        return Response(reply, status.HTTP_200_OK)

    def post(self, request, format=None):
        """
        create a new group
        """
        print('request.data', request.data)
        print('user', request.user)
        serializer = DeviceGroupSerializer(data=request.data)
        print('serializer', serializer)
        if serializer.is_valid():
            serializer.save()
            return Response(serializers.data, status.HTTP_200_OK)
        return Response(serializer.errors, status.HTTP_204_NO_CONTENT)

1 个答案:

答案 0 :(得分:1)

仔细查看,用户不在request.data:

from django.contrib.auth.models import User

class DeviceGroupSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(source='token', format='hex', read_only=True)
    owner = serializers.PrimaryKeyRelatedField(queryset=User.objects.all())
    class Meta:
        model = DeviceGroup
        fields = ['id','name', 'owner']

还要检查序列化程序是否允许使用所有者

{{1}}