Как и в этот вопрос , за исключением того, что я хочу иметь наборы запросов, которые возвращают смешанное тело объектов:
>>> Product.objects.all()
[<SimpleProduct: ...>, <OtherProduct: ...>, <BlueProduct: ...>, ...]
Я понял, что я не могу просто установить Product.Meta.abstract
в true или иначе просто объединить наборы запросов различных объектов. Хорошо, но это все подклассы общего класса, поэтому, если я оставлю их суперкласс как неабстрактный, я буду счастлив, пока я могу заставить его менеджера возвращать объекты соответствующего класса. Код запроса в 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, чтобы это исправить, или есть лучший способ достичь своих целей?