Аннотация на общее отношение

извините, я уверен, что есть способ сделать это с помощью Q-фильтров/F-выражений, но я не могу понять его правильно.

У меня есть общая модель версионирования и несколько версионируемых моделей:

class Version(models.Model):
    content_type = models.ForeignKey(
        ContentType, on_delete=models.CASCADE, limit_choices_to=VERSIONED_OBJECTS_LIMIT
    )
    object_id = models.PositiveIntegerField()
    source = GenericForeignKey("content_type", "object_id")

    object_uri = models.TextField(max_length=1024, null=True)
    version_number = models.IntegerField(default=1)
    is_latest = models.BooleanField(default=1)

class Dataset(models.Model):
    versions = GenericRelation(Version)

class DataModel(models.Model):
    versions = GenericRelation(version)

Я решил, что такой подход будет разумным, поскольку у нас довольно много версий моделей. Однако мне трудно создать аннотацию/запрос, который бы извлекал для меня все экземпляры модели, аннотированные последней версией. Для конкретного экземпляра это, конечно, тривиально, но я не могу понять, как это сделать для модели в целом.

latest_datasets = Dataset.objects.annotate(uri = version.uri).filter(versions__islatest=True)

Очевидно, что возвращаются все наборы данных, поскольку по замыслу каждый набор данных имеет хотя бы одну версию "is_latest".

Прошу прощения - возможно, это просто плохой дизайн базы данных, но я думаю, что сделать "Version" абстракцией Generic имело смысл для нашего случая использования. Итак, если есть способ получить все экземпляры Model_x с добавленной uri WHERE version.is_latest = True, я бы хотел узнать как.

Заранее спасибо, извините за мое невежество.

Вернуться на верх