web-dev-qa-db-fra.com

django - reconvertit une liste en un ensemble de requêtes

J'ai une poignée d'enregistrements que je voudrais trier en fonction d'une valeur calculée. J'ai la réponse ici ... comme ça:

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

sur une classe de profil comme celle-ci:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

Malheureusement, la vue générique attend un objet ensemble de requêtes et génère une erreur si je lui donne une liste.

Existe-t-il un moyen de le faire qui renvoie un ensemble de requêtes

ou...

Puis-je convertir une liste en un ensemble de requêtes d'une manière ou d'une autre? Je n'ai rien trouvé de tel dans les documents Django.

J'espère ne pas dénormaliser les données, mais je suppose que je le ferai si je le dois.

Mise à jour/réponse:

il semble que la seule façon de récupérer un ensemble de requêtes est de récupérer toute votre logique dans les requêtes SQL.

Lorsque cela n'est pas possible, (je pense), vous devez dénormaliser les données

53
Jiaaro

Il est inutile de reconvertir une liste de données en requête. Un objet de requête ne contient jamais de données; il représente simplement une requête vers la base de données. Il faudrait tout récupérer à nouveau si vous faites votre liste dans une requête, ce qui serait redondant et très mauvais en termes de performances.

Ce que tu peux faire:

  • Décrivez comment le champ reputation est calculé; il est probablement possible de commander les données dans la base de données d'une manière ou d'une autre.
  • Modifiez la vue pour qu'elle ne nécessite pas d'objet de requête. S'il doit effectuer un filtrage supplémentaire, etc., cela doit être fait avant toute commande, car la commande prendra moins de temps avec moins d'entrées (et moins de données seront extraites de la base de données.) Vous pouvez donc envoyer l'objet de requête filtré au tri fonction juste avant de l'envoyer au modèle (qui ne devrait pas se soucier s'il s'agit d'une requête ou d'une liste.)
21
Blixt

Ok ... ce message est maintenant ancien MAIS ce que vous pourriez faire est d'obtenir tous les ids des objets dans votre liste, puis effectuez une model.objects.filter(pk__in=list_of_ids)

87
neolaser