2013-01-10 10 views
40

Ho un gestore personalizzato per un modello Django. Non riesco a rilevare l'eccezione DoesNotExist qui. Io so come farlo all'interno del modello, ma non ha funzionato qui:CatchingNon esiste eccezione in un gestore personalizzato in Django

class TaskManager(models.Manager): 
    def task_depend_tree(self, *args, **kwargs): 
     if "id" in kwargs: 
      try: 
       task = self.get(id=kwargs["id"]) 
      except DoesNotExist: 
       raise Http404 

Get_object_or_404 non funziona neanche. Cosa c'è di sbagliato qui?

+2

Cosa significa "non funziona" significa , per entrambi questi casi? Cosa succede realmente? –

+0

@DanielRoseman NameError: nome globale "DoesNotExist" non definito – Seperman

risposta

76

Provare usando ObjectDoesNotExist anziché DoesNotExist o eventualmente self.DoesNotExist. Se tutto il resto fallisce, prova a prendere una vaniglia Exception e valutala per vedere il suo tipo().

from django.core.exceptions import ObjectDoesNotExist

+0

Avevo provato Self.DoesNotExist e non è riuscito. L'errore che ottengo quando qualcosa non esiste nel database è: 'NameError: nome globale 'DoesNotExist' non è definito 'Quindi devo importare DoesNotExist da qualche parte. Ho pensato che fosse nei modelli.Modello ma modelli.Model.DoesNotExist non ha funzionato. – Seperman

+0

self.DoesNotExist ovviamente non sarà di aiuto, perché auto esiste se ha un tale metodo. Utilizzare invece 'task.DoesNotExist' o' ObjectDoesNotExist'. –

+0

Hai provato il mio suggerimento di 'ObjectDoesNotExist'? L'altra sintassi potrebbe essere self.model.DoesNotExist ... ma non ne sono sicuro. –

1

è possibile utilizzare il DoesNotExist dall'istanza Manager.model (self.model), quando dici objects = MyManager() si sta assegnando self.model all'interno della classe MyManager.

 try: 
      task = self.get(id=kwargs["id"]) 
      return task 
     except self.DoesNotExist: 
      return None 
+1

'self' è il gestore, non il modello – imns

+0

Questo non funzionerà. Devi usare self.model.DoesNotExist –

8

Come suggerito dal panchicore, self.model è la strada da percorrere.

class TaskManager(models.Manager): 
    def task_depend_tree(self, *args, **kwargs): 
     if "id" in kwargs: 
      try: 
       task = self.get(id=kwargs["id"]) 
      except self.model.DoesNotExist: 
       raise Http404 
0

Se è necessario implementare questo su un metodo di lista (DRF) utilizzando GenericViewSet, e hanno bisogno di una lista vuota per essere restituito, utilizzare questo:

def list(self, request, *args, **kwargs): 
    self.get_object() # I use this to trigger the object_permission 
    try: 
     queryset = self.queryset.filter(user=(YourModel.objects.get(user=request.user).user)) 
    except YourModel.DoesNotExist: 
     return Response(YourModel.objects.none()) 

    serializer = YSourModelSerializer(queryset, many=True) 
    return Response(serializer.data) 
Problemi correlati