Django 获取所有基础 class 对象,它们的派生 class 具有混合

Django get all base class objects that their derived class has a mixin

我有看起来像这样的模型:

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)

我明白为什么这行不通,但我不知道如何让它真正起作用。

解决方案:感谢,我得到了一个可行的解决方案。我将它张贴在这里以防有一天它会对某人有所帮助。

除了希望将所有结果放在一起之外,我还希望它们按 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))

我可能不太理解你的问题,但是你可以使用__subclasses__魔术方法来解决这样的问题:

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

然后你就可以过滤那些模型,对它们做任何你想做的事了。