Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

190
Visualizações
django orm latest item group by each foreign key

We have following models:

class Publisher(models.Model):
    name = models.CharField(max_length=32)
    local_name = models.CharField(max_length=32)
    url_pattern = models.CharField(max_length=128)
    enabled = models.BooleanField(default=True)
    home_page = models.BooleanField(default=False)
    category = models.ForeignKey(NewspaperCategory, null=True)


class Newspaper(models.Model):
    class Meta:
        unique_together = ("publisher", "date")
        ordering = ("-date",)

    publisher = models.ForeignKey(Publisher)
    image = models.ImageField(upload_to=newspaper_upload_to)
    thumbnail = models.ImageField(upload_to=newspaper_thumbnail_upload_to)
    date = models.DateField()

I have a APIView (Django rest framework) and there are several different query parameters which filter the output of API. I'd like to have a "latest" query parameter which lists only the latest version of each publisher. Also, I need to be able to do further filtering and slicing on that QuerySet before evaluating it.

But the result of query should be Newspaper instances not dict so I can feed them to my serializer. My view looks like this at the moment :

class Newspapers(APIView):
    def get(self, request):

        queryset = models.Newspaper.objects.filter(deleted=False).prefetch_related('publisher')
        if "latest" in request.GET:
            # doing something here with queryset            
        if "publisher_id" in request.GET:
            queryset = queryset.filter(publisher_id=request.GET['publisher_id'])
        if "category" in request.GET:
            queryset = queryset.filter(publisher__category_id=request.GET['category'])
        if "before" in request.GET:
            queryset = queryset.filter(date__lt=request.GET['before'])
        if "after" in request.GET:
            queryset = queryset.filter(date__gte=request.GET['after'])
        if "home_page" in request.GET:
            queryset = queryset.filter(publisher__home_page=request.GET['home_page'].lower() == 'true')
        queryset = queryset.order_by('-date', 'publisher__order')
        return PagingResponse(
            request,
            serializers.NewspaperVersionSerializer,
            query=queryset,
            identifier_name='date'
        )
over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

We can do this with two queries:

        if "latest" in request.GET:
            latest_ids = list(  # <-- first query
                           queryset.order_by('id') 
                          .values('publisher_id')
                          .annotate(id=Max('id'))
                          .values_list('id', flat=True)
                          )
            queryset = queryset.filter(id__in=latest_ids) # <-- second query

the first query gets list of latest newspaper group by publisher, and the second query gets a queryset of those newspaper for further filtering, slicing and ...

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda