代码之家  ›  专栏  ›  技术社区  ›  ramusus

对queryset.get进行优化,使其在模型的管理器中不出现doesonexist异常。

  •  1
  • ramusus  · 技术社区  · 6 年前

    我有两个相似的模型,一个公共管理器,它为当前登录的用户返回查询集。我想要user_places.current_user.get(place=xxx)返回现有的user_place()对象或空的user_places(),当不出现texist异常时。怎么可能?如果我是对的,那么CurrentUserManager对用户位置和用户项目模型一无所知?

    我只是不想总是写:

    try:
        places = User_Places.current_user.get(place=XXX)
    except:
        places = User_Places()
    

    我的型号代码:

    class User_Places(models.Model):
        place = models.ForeignKey('Place')
        user = models.ForeignKey(User)
        current_user = CurrentUserManager()
    
    class User_Projects(models.Model):
        project = models.ForeignKey('Project')
        user = models.ForeignKey(User)
        current_user = CurrentUserManager()
    
    class CurrentUserManager(models.Manager):
        def get_query_set(self):
            user = threadlocals.get_current_user()
            qs = super(CurrentUserManager, self).get_query_set()
            if user:
                qs = qs.filter(user=user)
            return qs
    
        def get(self, *args, **kwargs):
            try:
                object = super(CurrentUserManager, self).get(*args, **kwargs)
            except:
                object = ????????????????????????
            return object
    
    1 回复  |  直到 16 年前
        1
  •  2
  •   laz    8 年前

    发现解 here . 管理器类中有self.model():

    class CurrentUserManager(models.Manager):
        ....
        def get(self, *args, **kwargs):
            try:
                object = super(CurrentUserManager, self).get(*args, **kwargs)
            except:
                object = self.model(**kwargs)
            return object