How do I get the object if it exists, or None if it does not exist?

后端 未结 19 1522
清酒与你
清酒与你 2020-11-28 01:14

When I ask the model manager to get an object, it raises DoesNotExist when there is no matching object.

go = Content.objects.get(name=\"baby\")
         


        
19条回答
  •  余生分开走
    2020-11-28 01:52

    I use Django 2.2.16. And this is how I solve this problem:

    from typing import Any
    
    from django.core.exceptions import ObjectDoesNotExist
    from django.db import models
    from django.db.models.base import ModelBase
    from django.db.models.manager import Manager
    
    
    class SManager(Manager):
        def get_if_exist(self, *args: Any, **kwargs: Any):
            try:
                return self.get(*args, **kwargs)
            except ObjectDoesNotExist:
                return None
    
    
    class SModelBase(ModelBase):
        def _prepare(cls):
            manager = SManager()
            manager.auto_created = True
            cls.add_to_class("objects", manager)
    
            super()._prepare()
    
        class Meta:
            abstract = True
    
    
    class SModel(models.Model, metaclass=SModelBase):
        managers = False
    
        class Meta:
            abstract = True
    

    And after that, in every models, you just need to import in:

    from custom.models import SModel
    
    
    class SUser(SModel):
        pass
    

    And in views, you can call like this:

    SUser.objects.get_if_exist(id=1)
    

提交回复
热议问题