django – converteer een lijst terug naar een queryset

Ik heb een handvol records die ik wil sorteren op basis van een berekende waarde. Heb je het antwoord hier… graag:

sorted(Profile.objects.all(), key=lambda p: p.reputation)

in een profielklasse zoals deze:

class Profile(models.Model):
    ...
    @property
    def reputation(self):
        ...

Helaas verwacht de generieke weergave een queryset-object en geeft een foutmelding als ik het een lijst geef.

Is er een manier om dit te doen die een queryset retourneert

of…

Kan ik een lijst op de een of andere manier converteren naar een queryset?Ik kon zoiets niet vinden in de django-documenten.

Ik hoop de gegevens niet te denormaliseren, maar ik denk dat ik dat wel zal doen als het moet.

Update / Antwoord:

het lijkt erop dat de enige manier om een ​​queryset terug te krijgen is als je al je logica in de sql-query’s kunt krijgen.

Als dat niet mogelijk is, (denk ik) moet je de gegevens denormaliseren


Antwoord 1, autoriteit 100%

Ok…deze post is nu oud MAAR wat je zou kunnen doen is alle idsvan de objecten in je lijst ophalen, en dan een model.objects.filter(pk__in=list_of_ids)


Antwoord 2, autoriteit 23%

Het heeft geen zin om een ​​gegevenslijst terug te converteren naar een query. Een query-object bevat nooit gegevens; het vertegenwoordigt gewoon een query naar de database. Het zou alles opnieuw moeten ophalen als je je lijst voor een query zou maken, en dat zou overbodig zijn en erg slecht qua prestaties.

Wat u kunt doen:

  • Beschrijf hoe het veld reputationwordt berekend; het is waarschijnlijk mogelijk om de gegevens in de database op de een of andere manier te ordenen.
  • Wijzig de weergave zodat er geen query-object nodig is. Als er extra moet worden gefilterd, enz., moet dit worden gedaan voordat er wordt besteld, omdat het bestellen minder tijd kost met minder invoer (en er minder gegevens uit de database worden opgehaald). U kunt het gefilterde query-object dus naar de sorteergroep sturen. functie net voordat u het naar de sjabloon verzendt (het zou niet moeten uitmaken of het een query of een lijst is.)

Other episodes