Допустим, у меня есть эти модели.
class AdventureWaypoint(models.Model):
adventure = models.ForeignKey("Adventure", on_delete=models.CASCADE)
waypoint = models.ForeignKey("Waypoint", on_delete=models.CASCADE)
created_timestamp = models.DateTimeField(auto_now_add=True)
class Waypoint(models.Model):
name = models.CharField(max_length=255)
class Adventure(models.Model):
waypoints = models.ManyToManyField("Waypoint", through='AdventureWaypoint', related_name='waypoints')
objects = AdventureManager()
Как я могу написать менеджер, который аннотирует first_waypoint
для каждого набора запросов?
Я пробовал следующее, но, к сожалению, Subquery
работает не так, как ожидалось. Не удалось также использовать F
.
class AdventureManager(models.Manager):
def get_queryset(self):
qs = super(AdventureManager).get_queryset()
first_waypoint = AdventureWaypoint.objects.filter(adventure_id=OuterRef("id")).order_by('created_timestamp').first().waypoint
return qs.annotate(first_waypoint=Subquery(first_waypoint, output_field=models.ForeignKey("Waypoint", on_delete=models.CASCADE, null=True, blank=True)))
Должен ли я прибегать к необработанному SQL или как это можно сделать с помощью Django ORM?
Примечание: я не хочу использовать @property, поскольку я хочу использовать это аннотированное поле в наборах запросов, например, для фильтрации.