Мне нужно предварительно получить данные, но только последние в 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())