1

我使用 ActiveState Komodo 已经有一段时间了,虽然大部分代码完成都在现场,但它缺乏 Django 模型管理器的代码完成。

我已将 Django 目录包含在我的目录中,PYTHONPATH并获得了大部分代码完成,值得注意的例外是模型。

假设我有一个模型users,我希望代码users.objects.显示自动完成选项,例如all(),count()filter()。但是这些是由模型的管理器添加的,它以一种看似不正常的方式这样做。

我想知道我是否可以“强制”Komodo 拿起模型。

模型管理器看起来包含在以下代码中(取自 manager.py)

def ensure_default_manager(sender, **kwargs):
"""
Ensures that a Model subclass contains a default manager  and sets the
_default_manager attribute on the class. Also sets up the _base_manager
points to a plain Manager instance (which could be the same as
_default_manager if it's not a subclass of Manager).
"""
cls = sender
if cls._meta.abstract:
    return
if not getattr(cls, '_default_manager', None):
    # Create the default manager, if needed.
    try:
        cls._meta.get_field('objects')
        raise ValueError("Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__)
    except FieldDoesNotExist:
        pass
    cls.add_to_class('objects', Manager())
    cls._base_manager = cls.objects
...

特别是最后两行。有什么方法可以告诉 Komodo,<model>.objects = Manager()以便显示正确的代码完成?

4

1 回答 1

0

可能最简单的方法似乎是将以下内容添加到 models.py 的顶部:

from django.db.models import manager

然后在每个模型下添加

objects = manager.Manager()

因此,例如,以下内容:

class Site(models.Model):
    name = models.CharField(max_length=200)
    prefix = models.CharField(max_length=1)
    secret = models.CharField(max_length=255)

    def __unicode__(self):
        return self.name

变成

class Site(models.Model):
    name = models.CharField(max_length=200)
    prefix = models.CharField(max_length=1)
    secret = models.CharField(max_length=255)

    objects = manager.Manager()

    def __unicode__(self):
        return self.name

这就是您将(显式)设置自己的模型管理器的方式,并且通过显式设置模型管理器(默认),Kommodo 可以完美地完成代码。

希望这会对某人有所帮助:-)

于 2011-08-17T16:20:42.440 回答