带有集成查询集的subclassed django模型

out*_*ure 7 python django metaclass django-models django-queryset

就像在这个问题中一样,除了我希望能够拥有返回混合对象的查询集:

>>> Product.objects.all()
[<SimpleProduct: ...>, <OtherProduct: ...>, <BlueProduct: ...>, ...]
Run Code Online (Sandbox Code Playgroud)

我发现我不能只设置Product.Meta.abstract为true或者只是将OR不同对象的查询集合在一起.很好,但这些都是公共类的子类,所以如果我把它们的超类保留为非抽象类,我应该感到高兴,只要我能让它的管理器返回正确类的对象.django中的查询代码完成了它的事情,只是调用Product().听起来很容易,除非它在我覆盖时爆炸Product.__new__,我猜测是因为__metaclass__在模型中...这里的非django代码表现得非常我想要它:

class Top(object):
    _counter = 0
    def __init__(self, arg):
        Top._counter += 1
        print "Top#__init__(%s) called %d times" % (arg, Top._counter)
class A(Top):
    def __new__(cls, *args, **kwargs):
        if cls is A and len(args) > 0:
            if args[0] is B.fav:
                return B(*args, **kwargs)
            elif args[0] is C.fav:
                return C(*args, **kwargs)
            else:
                print "PRETENDING TO BE ABSTRACT"
                return None # or raise?
        else:
            return super(A).__new__(cls, *args, **kwargs)
class B(A):
    fav = 1
class C(A):
    fav = 2
A(0) # => None
A(1) # => <B object>
A(2) # => <C object>
Run Code Online (Sandbox Code Playgroud)

但如果我继承django.db.models.Model而不是object:

File "/home/martin/beehive/apps/hello_world/models.py", line 50, in <module>
    A(0)
TypeError: unbound method __new__() must be called with A instance as first argument (got ModelBase instance instead)
Run Code Online (Sandbox Code Playgroud)

这是一个特别糟糕的回溯; 我也无法__new__在调试器中进入我的代码框架.我已经试过各种super(A, cls),Top,super(A, A),和所有结合上述的与传递cls作为第一个参数__new__,都无济于事.为什么这么踢我?我是否必须弄清楚django的元类才能解决这个问题,还是有更好的方法来实现目标?

Sti*_*ere 4

基本上,您想要做的是返回不同的子类,同时查询共享基类。那就是:您想要叶类。检查此代码片段以获取解决方案:http://www.djangosnippets.org/snippets/1034/

另外,请务必查看 Django 的 Contenttypes 框架上的文档: http: //docs.djangoproject.com/en/dev/ref/contrib/contenttypes/一开始可能会有点令人困惑,但 Contenttypes 会解决您的其他问题在 Django 的 ORM 中使用非抽象基类时,您可能会遇到这种情况。