Django获取其派生类具有mixin的所有基类对象

时间:2017-02-15 08:51:24

标签: python django django-rest-framework mixins

我的模型看起来像这样:

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 = ...

现在,我希望能够获取源自BaseMixin1的所有对象,而无需显式列出使用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))

1 个答案:

答案 0 :(得分:4)

我可能不清楚你的问题,但你可以使用__subclasses__魔法来做这样的事情:

>>> set(Mixin1.__subclasses__()) & set(Base.__subclasses__())
{Derive2, Derive1}

然后你可以过滤这些模型并做任何你想做的事情。

相关问题