【问题标题】:Tune queryset.get for working without DoesNotExist exception in model's Manager调整 queryset.get 以在模型管理器中不存在 DoesNotExist 异常的情况下工作
【发布时间】:2009-05-06 16:55:03
【问题描述】:

我有两个相似的模型和一个通用的管理器,它返回当前登录用户的查询集。当引发 DoesNotExist 异常时,我希望 User_Places.current_user.get(place=XXX) 返回现有的 User_Place() 对象或空的 User_Places()。这怎么可能? CurrentUserManager 对 User_Places 和 User_Projects 模型一无所知,如果我是对的?

我只是不想总是写:

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

【问题讨论】:

  • UserProjects 与什么有什么关系?为什么 UserProjects 完全引用 UserManager?
  • 第二个问题的答案:CurrentUserManager 允许专门为当前登录的用户获取 UserProjects 和 UserPlaces 对象。第一个问题我没听懂,抱歉。

标签: django django-models


【解决方案1】:

找到解决方案here。 Manager 类里面有 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

【讨论】:

    猜你喜欢
    • 2019-01-03
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多