python - 在 Django 的管理器中验证对象属性

标签 python django

我有一个经理

class MyManager(models.Manager):
    TYPE_PENDING = 1

    def pending():
        return self.filter(type=self.TYPE_PENDING)

现在我总能得到待定对象的查询集。

但是我还可以做一些事情来检查对象是否处于挂起状态吗?

我当然可以使用 if object.type == MyManager.TYPE_PENDING: 但是我可以在管理器中做一些事情吗,所以我不必调用 MyManager.TYPE_PENDING 在管理器之外,而是创建一个像

这样的函数
def is_pending():
    return self.type == self.TYPE_PENDING

或类似的东西。

我也可以做类似 if object in Model.objects.pending(): 的事情,但它加载整个查询集后性能不会很差吗?

编辑

如果我有两个管理器 PackageManagerStateManager 与模型 PackageState 相关,resp.

class PackageManager(models.Manager):
    def delivered(self):
        return self.filter(current_state__type=1)

class StateManager(models.Manager):
    def delivered(self):
        return self.filter(type=self.model.TYPE_DELIVERED)

我在 State 中定义了我的选择(TYPE_DELIVERED 等)。我可以在 PackageManager 中将 1 替换为告诉它应该是 TYPE_DELIVERED 的东西吗?

我知道我可以编写 current_state__type=State.TYPE_DELIVERED 但如果我应该将管理器导入模型并将模型导入管理器,它会导致循环导入。

我可以利用它为所有已交付的状态查询集过滤吗?

我的意思是如果我能做类似的事情

class PackageManager(models.Manager):
    def delivered(self):
        return self.filter(current_state__type=StateManager.model.TYPE_DELIVERED)

最佳答案

我认为在模型本身中定义 TYPE_PENDING 会更合适:

class MyModel(models.Model):
    TYPE_PENDING = 1
    ...

    @property
    def is_pending(self):
        return self.type == self.TYPE_PENDING

    objects = MyManager()

...

class MyManager(models.Manager):
    def pending():
        return self.filter(type=self.model.TYPE_PENDING)

关于python - 在 Django 的管理器中验证对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30743785/

相关文章:

python - 修改中间件中的 Django 设置变量

python - 性能突然从 1024 字节下降到 1025 字节

Django 模型在错误的列中返回值

python - 如何将按键事件发送到 webkit.WebView() 控件?

python - 为什么 Python 没有内置混合 getattr + __getitem__?

python - twisted.web.resource.Resource 和 twisted.web.template.Element 示例

Django Postgres 错误,字段 "is not of a character type"

python - 在循环中创建 lambda

python - 在 Cython 代码中使用 float 文字而不是 double?

django - Pycharm + Django 1.3 + 模板中的 STATIC_URL = 未解析的静态引用