Используя Django ORM, у меня есть несколько моделей (A, B, C, A2B, B2C), которые все наследуют от ValidityMixinModel
, который представляет их период действия.
class ValidityMixinModel(models.Model):
validity_range = DateRangeField(null=True, blank=True)
class Meta:
abstract = True
class A(ValidityMixinModel):
Bs = models.ManyToManyField("B", through="A2B")
class B(ValidityMixinModel):
As = models.ManyToManyField(A, through="A2B")
Cs = models.ManyToManyField("C", through="B2C")
class C(ValidityMixinModel):
Bs = models.ManyToManyField(B, through="B2C")
class A2B(ValidityMixinModel):
a = models.ForeignKey(A, related_name="Bs_through", on_delete=models.CASCADE)
b = models.ForeignKey(B, related_name="As_through", on_delete=models.CASCADE)
class B2C(ValidityMixinModel):
b = models.ForeignKey(B, related_name="Cs_through", on_delete=models.CASCADE)
c = models.ForeignKey(C, related_name="Bs_through", on_delete=models.CASCADE)
Я хотел быбыть в состоянии отфильтровать все объекты (A, B, C, A2B, B2C), которые действительны в данный день, простым способом, например:
with ValidityMixinModel.valid_on_context_manager(date(2018,11,23)):
# only display objects A with their related Bs
# as if A, B and A2B instances had all the filter
# validity_range__contains=DateRange(date(2018,11,23),date(2018,11,24))
print(A.objects.prefetch_related("Bs","Bs_Cs").all())
Есть идеи, как это сделать?