像this question,但我希望能有返回對象的混合體的查詢集:子類Django模型集成了查詢集
>>> Product.objects.all()
[<SimpleProduct: ...>, <OtherProduct: ...>, <BlueProduct: ...>, ...]
我想通了,我不能只設置Product.Meta.abstract
爲真或者以其他方式將或不同對象的查詢集合在一起。好,但這些都是普通類的所有子類,所以如果我把它們的超類作爲非抽象類,我應該很高興,只要我能讓它的管理器返回適當類的對象。 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>
但失敗如果我從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)
這是一個特別糟糕的回溯;我無法在調試器中進入我的__new__
代碼的框架。我已經各種嘗試super(A, cls)
,Top
,super(A, A)
,以上所有結合傳遞cls
作爲第一個參數到__new__
,都無濟於事。爲什麼這踢我這麼難?我是否必須弄清楚django的metaclasses能夠解決這個問題還是有更好的方法來完成我的目標嗎?
人們很容易揣摩的困擾,但直覺告訴我,你就錯了。這就像對Django可憐的小ORM的折磨一樣。 – keturn 2010-03-30 06:44:09