2013-01-10 25 views
40

Tôi có trình quản lý tùy chỉnh cho mô hình Django. Tôi không có vẻ để có thể bắt ngoại lệ DoesNotExist ở đây. Tôi biết cách làm điều đó bên trong mô hình nhưng nó không hoạt động ở đây:Ghi ngoại lệ KhôngNotExist trong trình quản lý tùy chỉnh ở 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 cũng không hoạt động. Có gì sai ở đây?

+2

gì "không hoạt động" có nghĩa là , cho cả hai trường hợp đó? Điều gì thực sự xảy ra? –

+0

@DanielRoseman NameError: tên toàn cục 'DoesNotExist' không được xác định – Seperman

Trả lời

76

Hãy thử sử dụng ObjectDoesNotExist thay vì DoesNotExist hoặc có thể self.DoesNotExist. Nếu mọi thứ khác thất bại, chỉ cần thử và bắt một vanilla Exception và đánh giá nó để xem loại đó().

from django.core.exceptions import ObjectDoesNotExist

+0

Tôi đã thử Self.DoesNotExist và không thành công. Các lỗi tôi nhận được khi một cái gì đó không tồn tại trong cơ sở dữ liệu là: 'NameError: tên toàn cầu 'DoesNotExist' không được định nghĩa' Vì vậy, tôi cần phải nhập khẩu DoesNotExist từ một nơi nào đó. Tôi giả định nó là trong models.Model nhưng models.Model.DoesNotExist không hoạt động. – Seperman

+0

self.DoesNotExist rõ ràng sẽ không giúp đỡ, bởi vì tự tồn tại nếu nó có một phương pháp như vậy. Thay vào đó, hãy sử dụng 'task.DoesNotExist' hoặc' ObjectDoesNotExist'. –

+0

Bạn đã thử đề xuất của tôi về 'ObjectDoesNotExist'? Cú pháp khác có thể là self.model.DoesNotExist ... nhưng tôi không chắc chắn trên đầu của tôi. –

1

bạn có thể sử dụng DoesNotExist từ dụ Manager.model (self.model), khi bạn nói objects = MyManager() bạn đang gán self.model bên trong lớp MyManager.

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

'self' là người quản lý, không phải là người mẫu – imns

+0

Điều này sẽ không hoạt động. Bạn phải sử dụng self.model.DoesNotExist –

8

Như đã đề nghị panchicore, self.model là cách để thực hiện.

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

Nếu bạn cần phải thực hiện điều này trên một phương pháp danh sách (DRF) sử dụng GenericViewSet, và cần một danh sách trống để được trả lại, sử dụng này:

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) 
Các vấn đề liên quan