myqueryset = Content.objects.filter(random 100)
Répondre
Content.objects.all().order_by('?')[:100]
Voir la order_by docs. Sachez également que cette approche ne s'adapte pas bien (en fait, elle évolue vraiment, très mal). Voir this SO answer pour une meilleure façon de gérer la sélection aléatoire lorsque vous avez de grandes quantités de données.
Si vous allez le faire plus d'une fois, vous devez le concevoir dans votre base de données.
Si vous le faites une fois, vous pouvez vous permettre de payer la pénalité lourde. Cela vous donne exactement 100 avec de très bonnes propriétés aléatoires. Cependant, il utilise beaucoup de mémoire.
pool= list(Content.objects.all())
random.shuffle(pool)
object_list = pool[:100]
Voici un autre algorithme qui est également un peu lent car il peut rechercher toute la table. Il n'utilise pas très bien la mémoire du tout et il ne peut pas obtenir exactement 100.
total_count= Content.objects.count()
fraction = 100./total_count
object_list = [ c for c in Content.objects.all() if random.random() < fraction ]
Si vous voulez faire plus d'une fois, vous devez ajouter un attribut au contenu pour permettre un filtrage efficace pour « aléatoire " valeurs. Par exemple, vous pourriez le faire.
class Content(models.Model):
... etc. ...
def subset(self):
return self.id % 32768
Cela va partitionner vos données en 32768 sous-ensembles distincts. Chaque sous-ensemble est 1/32768ème de vos données. Pour obtenir 100 éléments aléatoires, vous avez besoin de 100 * 32768/total_count sous-ensembles de vos données.
total_count = Content.objects.count()
no_of_subsets= 100*32768/total_count
object_list = Content.objects.filter(subset__lte=no_of_subsets)
Ceci est rapide et il est reproductible. Les sous-ensembles sont «arbitraires» et non techniquement «aléatoires».
Bon point pour la performance –
J'aime votre dernière approche même si je ne pense pas que vous pouvez filtrer sur les propriétés. Vous devez ajouter la colonne de sous-ensemble dans le modèle lui-même et définir sa valeur sur Enregistrer comme ceci: http://ifacethoughts.net/2009/07/14/calculated-fields-in-django/ – jesal
Ajouter un sous-ensemble comme méthode au modèle de contenu n'est pas suffisant pour filtrer, comme suggéré dans votre dernier extrait. –
je fais:
import random
object_list = list(Content.objects.filter(foo=bar).values()[:100])
random.shuffle(object_list)
Runs seule requête MySQL simple simple et est bon sur la performance.
Cela ne retourne pas les enregistrements aléatoires de la base de données. Il choisit le premier disque de centaine et les mélange. Les enregistrements 101 et suivants n'ont aucune chance d'être sélectionnés. – Blair
Je voulais suggérer l'utilisation de la fonction shuffle sur order_by ('?') Qui a de sérieux problèmes de performance: http://stackoverflow.com/a/6405601/232649 Pour shuffler tous les enregistrements: shuffle (list (Content.objects .all())) [: 100] – Pratyush
- 1. Obtenir 10 enregistrements aléatoires de base de données SQLite
- 2. Indexation des enregistrements de base de données dans lucene
- 3. Comptabiliser certains enregistrements dans la base de données
- 4. Db4o sélectionner des objets aléatoires
- 5. Comment sélectionner les enregistrements proches de l'un dans SQL?
- 6. comment récupérer des nombres aléatoires de lignes à partir de la base de données mysql?
- 7. Doublet sélectionner/supprimer dans la base de données MySQL
- 8. image de magasin django dans la base de données
- 9. Résultats des lignes de la base de données aléatoires
- 10. Reconnexion de la base de données dans Django
- 11. sélectionner les premiers enregistrements enregistrements ultérieurs
- 12. SQL sélectionner parmi les données dans la requête où ces données ne sont pas déjà dans la base de données?
- 13. Base de données HSQL 100% en mémoire
- 14. Filtres de modèle Django stockés dans la base de données
- 15. Modification de la base de données active dans django
- 16. Comment faire ce modèle de base de données dans Django?
- 17. comment puis-je ajouter 100 ans à une date dans la base de données Advantage
- 18. Django comment modifier les enregistrements de base de données par modèle
- 19. Comment sélectionner les enregistrements et le résumé dans une requête?
- 20. Sélectionner les enregistrements adjacents dans Mysql
- 21. Reprise de la base de données Django
- 22. Comparaison de date dans la base de données Oracle
- 23. Tri des enregistrements de base de données
- 24. transfering MySQL Les enregistrements de base de données à la base de données
- 25. mise à jour dans la base de données que les enregistrements mis à jour dans datatable
- 26. Drupal 6: obtenir des données aléatoires base de données
- 27. Mise à jour de base de données asynchrone dans Django?
- 28. données de base enregistrements manquants iphone
- 29. Enregistrement de plus de 1000 enregistrements dans la base de données à la fois
- 30. Comment affecter une catégorie tournante aux entrées de la base de données dans l'ordre dans lequel les enregistrements sont entrés?
Et le tout() est redondant, mais je ne m'en souviens jamais. – Tom
C'est génial! Par le débogage, j'ai remarqué qu'il génère même une bonne requête, en saisissant seulement 20 éléments, en utilisant 1 requête, en utilisant ORDER BY RAND() pour random. Bon dieu, c'est fantastique. –