我的模型看起来像这样:
class SomeModel(model.Model):
pass
class Base(models.Model):
field1 = ...
class Mixin1(models.Model):
some_model = models.ForeignKey('SomeModel', on_delete=models.CASCADE)
class Meta:
abstract = True
class Derive1(Base, Mixin1):
field2 = ...
class Derive2(Base, Mixin1):
field3 = ...
class Derive3(Base):
field4 = ...
现在,我希望能够获取源自Base
和Mixin1
的所有对象,而无需显式列出使用Mixin1
的所有类。
类似的东西:
Base.objects.filter(some_model=X)
为什么我的理解不起作用,但如何让它真正起作用我不知道。
解决方案:感谢valentjedi's answer我找到了一个有效的解决方案。我将它发布在这里以防有一天它会帮助某人。
除了想要所有结果之外,我还希望它们按Base中的日期字段排序,并能够自由过滤它们。所以我在Mixin1
创建了函数:
@staticmethod
def get_mixin1_objects(some_model, q_filter=None):
mixin_models = set(Mixin1.__subclasses__()) & set(Base.__subclasses__())
results = []
for mdl in mixin_models:
apply_filter = Q(some_model=some_model)
if q_filter is not None:
apply_filter &= q_filter
results.append(list(mdl.objects.filter(apply_filter).order_by('date').all()))
# Merge sort all the events
return list(heapq.merge(*results))
向Base添加方法:
def __gt__(self, other):
return self.date > other.date
因此,我可以应用我喜欢的过滤器,并且可以获得order_by
一个恒定的字段结果(这足以满足我当前的需要)。
使用示例:
lst = Mixinq.get_mixin1_objects(some_model_instance, q_filter=~Q(some_field_in_base=some_value))
答案 0 :(得分:4)
我可能不清楚你的问题,但你可以使用__subclasses__
魔法来做这样的事情:
>>> set(Mixin1.__subclasses__()) & set(Base.__subclasses__())
{Derive2, Derive1}
然后你可以过滤这些模型并做任何你想做的事情。