фильтрация нескольких моделей, имеющих поле DateRange как «validity_range» - PullRequest
0 голосов
/ 12 марта 2019

Используя 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())

Есть идеи, как это сделать?

...