Sphinx autodoc django无法正常工作

时间:2011-12-21 16:50:51

标签: python django python-sphinx

我已经开始使用Sphinx进行django项目了,我碰到了一堵砖墙:

模块记录如下:

:mod:`models` Module
--------------------

.. automodule:: userprofile.models
    :members:
    :undoc-members:
    :show-inheritance:

相关代码如下所示:

# models is django.db.models
class ProfileQuerystring(models.Model):
   [..]

问题是ProfileQuerystring 出现在HTML版本中。但是,如果我将继承移除到models.Model(因此该行看起来像class ProfileQuerystring:)并重新构建,则会记录该类。

这不会发生在代码之上的几行,我继承自models.Manager

任何人都可以帮助我或者至少给我一个提示吗?

稍后编辑

如果我手动添加它,它可以工作:

.. automodule:: cinely.userprofile.models
    :members:
    :undoc-members:
    :show-inheritance:

.. autoclass:: cinely.userprofile.models.ProfileQuerystring # <-- note this

因此可以记录,但不知何故automodule不想这样做。

LATER EDIT 2

我尝试从__metaclass__删除Model属性,但没有任何反应。此外,由于我已经开始编辑Django源代码,我有机会在控制台上打印一些东西,但什么都没发生。我可以确认使用了自定义的django,因为我已经卸载了pip已安装的django。

1 个答案:

答案 0 :(得分:1)

这是一个试探性的答案,可能是错的。这篇评论太长了......但是,如果你看一下django来源,你会注意到ModelManager有不同的继承三。特别是, Model类使用__metaclass__属性:

Manager

class Manager(object):
    # Tracks each time a Manager instance is created. Used to retain order.
    creation_counter = 0

Model

class Model(object):
    __metaclass__ = ModelBase
    _deferred = False

我的猜测(但这只不过是:猜测)是当ModelBase创建类时,它以一种混淆sphinx并使其无法理解的方式操纵__module__属性该类是模块models的一部分。

module = attrs.pop('__module__')
new_class = super_new(cls, name, bases, {'__module__': module})

这个假设与你的观察是一致的 - 当明确指定文档类时 - sphinx在生成文档时没有问题。

有帮助吗?


编辑:我刚才想到,验证此假设的一种简单方法是临时注释掉__metaclass__类定义中的Model行并查看是否存在狮身人面像捡起来......