Giống như trong this question, ngoại trừ tôi muốn để có thể có queryset mà trả về một cơ thể hỗn hợp của các đối tượng:mô hình django subclassed với queryset tích hợp
>>> Product.objects.all()
[<SimpleProduct: ...>, <OtherProduct: ...>, <BlueProduct: ...>, ...]
tôi đã tìm ra rằng tôi không thể chỉ cần đặt Product.Meta.abstract
true hoặc bằng cách khác HOẶC cùng với các querys của các đối tượng khác nhau. Tốt thôi, nhưng đây là tất cả các lớp con của một lớp phổ biến, vì vậy nếu tôi rời khỏi lớp bậc trên của chúng là không trừu tượng, tôi sẽ rất vui, miễn là tôi có thể đưa trình quản lý của nó trả về các đối tượng của lớp thích hợp. Mã truy vấn trong django làm điều của nó, và chỉ thực hiện cuộc gọi đến Product(). Nghe có vẻ dễ dàng đủ, ngoại trừ nó thổi lên khi tôi ghi đè Product.__new__
, tôi đoán vì __metaclass__
trong Model ... Đây là mã phi django mà ứng xử khá nhiều làm thế nào tôi muốn nó:
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>
Nhưng điều đó không nếu tôi kế thừa từ django.db.models.Model
thay vì 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)
Đó là một vết lùi đáng chú ý là không hấp dẫn; Tôi cũng không thể bước vào khung mã số __new__
của mình trong trình gỡ lỗi. Tôi đã thử một cách khác nhau super(A, cls)
, Top
, super(A, A)
và tất cả những điều trên kết hợp với việc chuyển số cls
vào làm đối số đầu tiên cho __new__
, tất cả đều không có kết quả. Tại sao điều này đá tôi quá khó? Tôi có phải tìm ra metaclasses của django để có thể sửa lỗi này hoặc có cách nào tốt hơn để hoàn thành kết thúc của tôi không?
Thật là hấp dẫn để tìm ra câu đố, nhưng bản năng nói với tôi rằng bạn đang làm điều đó sai. Điều này giống như tra tấn đến ORM nghèo nàn của Django. – keturn