Намерения создаются при использовании аннотации и внешнего ключа

У меня следующая ситуация:

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

Моим решением было создание таблицы Status с внешним ключом, указывающим на Person. Поиск самой последней записи в person.status_set упрощал бы поиск текущего состояния.

class Person(models.Model):
    ...
    def _get_status(self):
        return self.status_set.order_by("-timestamp").first()

    @property
    def status(self):
        try:
            return self._get_purchase_status().status
        except AttributeError:
            # TODO: log error: Person without status.
            return None # TODO: Change this.

    @status.setter
    def status(self, new_status):
        s = Status(
            person=self,
            status=new_status
        )
       s.save()

    @status.deleter
    def status(self):
        if self.status:
            self.status_set.order_by("-timestamp").first().delete()


class Status(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    status = models.CharField(
        max_length=50,
    )
    timestamp = models.DateTimeField(auto_now_add=True)

Когда я пытаюсь создать QuerySet, содержащий информацию о человеке и последнем статусе, я выполняю такой запрос:

Person.objects.annotate(
    person_status=Subquery(
        Status.objects.filter(person_id=OuterRef("id")).order_by("-timestamp").values("status")[:1]
    )
).values()

Вызов функции annotate с использованием .values() в конце работает как ожидалось, но когда я запускаю только функцию annotate,

Person.objects.annotate(
    person_status=Subquery(
        Status.objects.filter(person_id=OuterRef("id")).order_by("-timestamp").values("status")[:1]
    )
)

Я вижу, что в таблице Status создаются экземпляры для каждого Person (другими словами, в Status каждого экземпляра status_set добавляется новый экземпляр Person).

Я не думаю, что такое поведение ожидаемо. Не мог бы кто-нибудь подтвердить или объяснить, почему это происходит?

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