Намерения создаются при использовании аннотации и внешнего ключа
У меня следующая ситуация:
Я создаю приложение, где у меня есть модель 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
).
Я не думаю, что такое поведение ожидаемо. Не мог бы кто-нибудь подтвердить или объяснить, почему это происходит?