title: django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
body: <p>In an attempt to write object level permissions in Django with the Django Rest Framework, I have bumped into this error (full error log at bottom)</p>
  
  <pre><code>django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
  </code></pre>
  
  <p>The error comes from a get query, <code>ship = Ship.objects.get(id=shipID)</code>. See file:</p>
  
  <pre><code>from rest_framework.permissions import BasePermission
  from Ships.models import Ship
  
  import logging
  
  logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
  
  class HasObjectLevelPermissions(BasePermission):
      def has_permission(self, request, view):
          if request.method == "GET":
              return True
          else:
              logging.debug("not a GET request")
              shipID = request.POST.get('id',None)
              try:
                  ship = Ship.objects.get(id=shipID)  # This line is the issue
                  return request.user.userprofile.ship.id == ship.id
              except:
                  logging.debug("Error in finding ship when checking permissions")
          return False
  </code></pre>
  
  <p>Below is the Ship model where the UUID is declared. </p>
  
  <pre><code>class Ship(models.Model):
      id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
      regNum = models.CharField(max_length=100, blank=False, db_index=True)
      year = models.IntegerField(blank=True)
      make = models.CharField(max_length=255)
      length = models.IntegerField(blank=True)
      beam = models.IntegerField(blank=True)
      fleet = models.ForeignKey(Fleet)
      created = models.DateTimeField(auto_now_add=True, db_index=True)
  
      def getRegNum(self):
          return self.regNum
  </code></pre>
  
  <p><strong>Debugging attempts</strong></p>
  
  <ol>
  <li>Changing <code>ship = Ship.objects.get(id=shipID)</code> to <code>ship = Ship.objects.get(id="some string")</code> makes the validation error disappear. </li>
  <li>Changing <code>ship = Ship.objects.get(id=shipID)</code> to <code>ship = Ship.objects.get(id="")</code> makes the validation error disappear. This one is intriguing because an empty string passes the validation.</li>
  <li>Changing <code>shipID = request.POST.get('id',None)</code> to <code>shipID = request.GET.get('id',None)</code> makes the validation error disappear.</li>
  <li>I have logged the uuid being passed in from the POST request and it is indeed a properly formatted uuid (see below)</li>
  </ol>
  
  <p><a href="https://i.stack.imgur.com/709Yx.png" rel="noreferrer"><img src="https://i.stack.imgur.com/709Yx.png" alt="enter image description here"></a></p>
  
  <ol start="5">
  <li>I have tried deleting the entire Postgres database along with migrations as suggested <a href="https://stackoverflow.com/questions/28473923/django-core-exceptions-validationerror-error">here</a>.</li>
  <li>I have run a "SELECT * FROM" on every single table to ensure that no table has an empty uuid</li>
  <li>I have consulted the <a href="https://docs.djangoproject.com/en/1.11/_modules/django/db/models/fields/" rel="noreferrer">official docs</a> under <code>class UUIDField(Field):</code>.</li>
  <li><p>Logging the id from POST body.</p>
  
  <p><code>System check identified no issues (0 silenced).
  June 21, 2017 - 00:44:24
  Django version 1.11.1, using settings 'First_REST_API.settings'
  Starting development server at http://127.0.0.1:8000/
  Quit the server with CTRL-BREAK.
  DEBUG:CHECKING PERMISSIONS
  DEBUG:not a GET request
  DEBUG:6b25b0be-610a-49f5-ad60-6df9564185a0
  Internal Server Error: /ships
  Traceback (most recent call last):
  '''Same error as below'''</code></p></li>
  </ol>
  
  <p>Essentially I am trying to retrieve a Ship object that matches an id. This type of query has always worked in the past with strings, unsure why the validation error keeps coming up. Any ideas?</p>
  
  <p><strong>Full error log</strong></p>
  
  <pre><code>Internal Server Error: /ships
  Traceback (most recent call last):
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2392, in to_python
      return uuid.UUID(value)
    File "C:\Users\ptao\AppData\Local\Programs\Python\Python36-32\lib\uuid.py", line 140, in __init__
      raise ValueError('badly formed hexadecimal UUID string')
  ValueError: badly formed hexadecimal UUID string
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
      response = get_response(request)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
      response = self.process_exception_by_middleware(e, request)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
      response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
      return view_func(*args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\generic\base.py", line 68, in view
      return self.dispatch(request, *args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 489, in dispatch
      response = self.handle_exception(exc)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 449, in handle_exception
      self.raise_uncaught_exception(exc)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 486, in dispatch
      response = handler(request, *args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\ViaDjango\First_REST_API\Ships\views.py", line 110, in delete
      ship = Ship.objects.get(id=id)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
      return getattr(self.get_queryset(), name)(*args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 374, in get
      num = len(clone)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 232, in __len__
      self._fetch_all()
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 1103, in _fetch_all
      self._result_cache = list(self._iterable_class(self))
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 53, in __iter__
      results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 863, in execute_sql
      sql, params = self.as_sql()
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 420, in as_sql
      where, w_params = self.compile(self.where) if self.where is not None else ("", [])
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
      sql, params = node.as_sql(self, self.connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\where.py", line 79, in as_sql
      sql, params = compiler.compile(child)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
      sql, params = node.as_sql(self, self.connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 170, in as_sql
      rhs_sql, rhs_params = self.process_rhs(compiler, connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 103, in process_rhs
      return self.get_db_prep_lookup(value, connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 196, in get_db_prep_lookup
      [get_db_prep_value(value, connection, prepared=True)]
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2383, in get_db_prep_value
      value = self.to_python(value)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2397, in to_python
      params={'value': value},
  django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
  ERROR:Internal Server Error: /ships
  Traceback (most recent call last):
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2392, in to_python
      return uuid.UUID(value)
    File "C:\Users\ptao\AppData\Local\Programs\Python\Python36-32\lib\uuid.py", line 140, in __init__
      raise ValueError('badly formed hexadecimal UUID string')
  ValueError: badly formed hexadecimal UUID string
  
  During handling of the above exception, another exception occurred:
  
  Traceback (most recent call last):
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
      response = get_response(request)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response
      response = self.process_exception_by_middleware(e, request)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response
      response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\decorators\csrf.py", line 58, in wrapped_view
      return view_func(*args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\views\generic\base.py", line 68, in view
      return self.dispatch(request, *args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 489, in dispatch
      response = self.handle_exception(exc)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 449, in handle_exception
      self.raise_uncaught_exception(exc)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\rest_framework\views.py", line 486, in dispatch
      response = handler(request, *args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\ViaDjango\First_REST_API\Ships\views.py", line 110, in delete
      ship = Ship.objects.get(id=id)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
      return getattr(self.get_queryset(), name)(*args, **kwargs)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 374, in get
      num = len(clone)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 232, in __len__
      self._fetch_all()
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 1103, in _fetch_all
      self._result_cache = list(self._iterable_class(self))
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\query.py", line 53, in __iter__
      results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 863, in execute_sql
      sql, params = self.as_sql()
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 420, in as_sql
      where, w_params = self.compile(self.where) if self.where is not None else ("", [])
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
      sql, params = node.as_sql(self, self.connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\where.py", line 79, in as_sql
      sql, params = compiler.compile(child)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\sql\compiler.py", line 373, in compile
      sql, params = node.as_sql(self, self.connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 170, in as_sql
      rhs_sql, rhs_params = self.process_rhs(compiler, connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 103, in process_rhs
      return self.get_db_prep_lookup(value, connection)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\lookups.py", line 196, in get_db_prep_lookup
      [get_db_prep_value(value, connection, prepared=True)]
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2383, in get_db_prep_value
      value = self.to_python(value)
    File "C:\Users\ptao\Desktop\ViaFleet\VirtualEnvironment\lib\site-packages\django\db\models\fields\__init__.py", line 2397, in to_python
      params={'value': value},
  django.core.exceptions.ValidationError: ["'' is not a valid UUID."]
  [21/Jun/2017 00:08:53] "DELETE /ships HTTP/1.1" 500 20510
  </code></pre>
  
  <p><strong>Edit</strong>
  The issue was due to a bug in views.py. Thank you to @Sardorbek Imomaliev for pointing that out. <code>id = request.GET.get('id', '')</code> should have been <code>id = request.POST.get('id', '')</code>. Note that request.POST will contain the DELETE request body. See the comment under this <a href="https://stackoverflow.com/questions/26898475/how-to-get-post-delete-in-django-request">post</a> for more. Thank you to everything that helped.</p>
  
  <pre><code>class ShipEndpoint(generics.ListAPIView):
      permission_classes = (IsAuthenticated,HasObjectLevelPermissions)
  
      ''' get, post not shown'''
  
      def delete(self, request, format=None):
          id = request.GET.get('id', '')   #GET should have been DELETE
          ship = Ship.objects.get(id=id)
          # ship.fleet.numberOfShips = ship.fleet.numberOfShips - 1
          ship.fleet.save()
          return Response("success")
          # ship.delete()
  </code></pre>