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 = ...
现在我希望能够获取从 Base
和 Mixin1
派生的所有对象,而不是明确列出所有使用 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}
然后你就可以过滤那些模型,对它们做任何你想做的事了。
我有看起来像这样的模型:
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)
我明白为什么这行不通,但我不知道如何让它真正起作用。
解决方案:感谢
除了希望将所有结果放在一起之外,我还希望它们按 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}
然后你就可以过滤那些模型,对它们做任何你想做的事了。