Tôi đang cố gắng tìm lớp thực tế của đối tượng mô hình django, khi sử dụng mô hình thừa kế.Làm cách nào để tìm "lớp bê tông" của mô hình django baseclass
Một số mã để mô tả các vấn đề:
class Base(models.model):
def basemethod(self):
...
class Child_1(Base):
pass
class Child_2(Base):
pass
Nếu tôi tạo các đối tượng khác nhau của hai lớp trẻ và tạo ra một queryset chứa tất cả:
Child_1().save()
Child_2().save()
(o1, o2) = Base.objects.all()
Tôi muốn để xác định xem đối tượng thuộc loại Child_1 hoặc Child_2 trong basemethod, tôi có thể tới đối tượng con thông qua o1.child_1 và o2.child_2 nhưng nó sẽ kiểm tra kiến thức về các lớp con trong baseclass.
tôi đã đưa ra đoạn mã sau:
def concrete_instance(self):
instance = None
for subclass in self._meta.get_all_related_objects():
acc_name = subclass.get_accessor_name()
try:
instance = self.__getattribute__(acc_name)
return instance
except Exception, e:
pass
Nhưng nó cảm thấy giòn và tôi không chắc chắn về những gì sẽ xảy ra khi nếu tôi thừa hưởng ở mức độ nhiều hơn.
Cảm ơn, đã giải quyết được vấn đề của tôi –
Tôi không biết nếu đó là vì tôi đang trên django 1.4, nhưng điều này không làm việc cho tôi cho đến khi tôi sử dụng 'if (not self.content_type_id)' thay vì self.content_type. rõ ràng Django đã cố gắng để tải self.content_type, do đó dẫn đến 'DoesNotExist' –
AFAIK này là chính xác những gì gói này không: https://django-polymorphic.readthedocs.org/en/latest/ Nó trả về lớp con cụ thể ngay cả khi bạn sử dụng BaseClass.objects.filter() – guettli