Мне нужно предварительно получить данные, но только последние в django

  class AppliedEvent(models.Model):

    event_type = models.ForeignKey(EventType, on_delete=models.CASCADE, related_name='applied_events', null=True)
    seedbed = models.ForeignKey(Seedbed, on_delete=models.CASCADE, null=True, related_name='applied_events')
    seed = models.ForeignKey(Seed, on_delete=models.CASCADE, related_name='applied_events', null=True)
    user = models.ForeignKey(UserModel, on_delete=models.CASCADE, related_name='applied_events', null=True)

class AppliedEventTime(models.Model):

    start_time = models.DateTimeField()
    end_time = models.DateTimeField()
    event = models.ForeignKey(AppliedEvent, on_delete=models.CASCADE, related_name='times')
    applied_by = models.ForeignKey(UserModel, on_delete=models.CASCADE, related_name='applied_times', null=True)

Пользователь имеет возможность добавить новое время события, создав новый экземпляр AppliedEventTime.

class AppliedEventMixin:
    request: Any
    def get_queryset(self) -> QuerySet:
        return AppliedEvent.objects.filter(user_id=self.context.request.user).select_related(
        'user', 'event_type', 'seedbed', 'seed'
        ).only('user__username', 'event_type__name', 'seedbed__id', 'seed__id').prefetch_related(
        'times'
            )

Это мой миксин набора запросов для контроллера django-extra

@api_controller('/applied_event', auth=JWTAuth(), permissions=[IsAuthenticated])
class AppliedEventController(AppliedEventMixin):
    @route.get('/applied_event/{event_id}', tags=['applied_event'], response=AppliedEventOutSchema)
    def event_by_id(self, event_id: int):
        event = get_object_or_404(self.get_queryset(), pk=event_id)

        return event

Это контроллер для API и точки.

class EventTypeNameSchema(Schema):
    id: int
    name: str

AppliedEventTimeSchema = create_schema(AppliedEventTime, exclude=['id', 'event'], custom_fields=[('applied_by', UserOutSchema, None)])

class UserOutSchema(Schema):
    id: int
    username: str

class AppliedEventOutSchema(ModelSchema):
    event_type: EventTypeNameSchema
    user: UserOutSchema
    times: List[AppliedEventTimeSchema]
    
    class Config:
        model = AppliedEvent
        include = ['id', 'seedbed', 'seed']

Это моя схема.

мой вопрос в том, как я могу получить только последний добавленный экземпляр AppliedEventTime, связанный с AppliedEvent?

Вы можете использовать order_by('-id') для упорядочивания AppliedEventTime экземпляров в порядке убывания и use first() метод для получения последнего добавленного экземпляра.

class AppliedEventMixin:
    request: Any
    def get_queryset(self) -> QuerySet:
        return AppliedEvent.objects.filter(user_id=self.context.request.user).select_related(
        'user', 'event_type', 'seedbed', 'seed'
        ).only('user__username', 'event_type__name', 'seedbed__id', 'seed__id').prefetch_related(
        Prefetch('times', queryset=AppliedEventTime.objects.order_by('-id').first())
            )

Или, в качестве альтернативы, вы можете модифицировать класс AppliedEventMixin, чтобы получать только последний добавленный экземпляр AppliedEventTime, связанный с AppliedEvent. Замените строку с Prefetch... в приведенном выше решении на:

Prefetch('times', queryset=AppliedEventTime.objects.latest())
Вернуться на верх