Django-Code zum Abrufen von IDs aus Abfragegruppe, Shuffle-IDs und Abfragedatenbank in gemischter Reihenfolge - Python, MySQL, Django, Datenbank

Ich versuche in Django Folgendes zu tun:

  1. Führen Sie eine Datenbankabfrage durch, um die IDs aller Datensätze zurückzugeben, die die Abfrage erfüllen.
  2. Die Liste der IDs aus der Abfrage wird in eine zufällige Reihenfolge gemischt.
  3. Erstellen Sie ein neues Abfrage-Set, das Datensätze aus der Datenbank in der gemischten Reihenfolge abruft.

Also, wenn meine anfängliche Datenbankabfrage so aussieht:

queryset = Item.objects.filter(my_field = a_value)

Wie kann ich eine Liste von IDs aus der Abfrage abrufen, sodass ich mit folgenden Elementen mischen kann:

random.shuffle(list_of_ids_matching_query)

I.e. Ich möchte das erstellen list_of_ids_matching_query aus dem Abfrage-Set, aber ich kann nicht herausfinden, wie das geht.

Ich plane dann, eine Abfrage in Richtung von:

queryset = Item.objects.filter(pk__in=list_of_ids_matching_query)

Aber ich brauche die Abfrage, um Datensätze in der gleichen Reihenfolge wie die IDs in der gemischten Liste zurückzugeben. Wird es das tun? Oder muss ich die Datensätze einzeln aus der Datenbank extrahieren.

Was ich versuche zu tun, und es könnte auch ein besserer Weg sein, dies zu tun, ist eine zufällige Reihe von Ergebnissen in zufälliger Reihenfolge von der Datenbank zu bekommen.

Antworten:

2 für die Antwort № 1

Versuchen Sie diese Abfrage

list_of_ids_matching_query = list(Item.objects.filter(my_field = a_value).values_list("id", flat=True))

Um Datensätze in derselben Reihenfolge zu erhalten wie die IDs in der gemischten Liste,

ordering = "FIELD(`id`, %s)" % ",".join(str(id) for id in shuffiled_list)
Item.objects.filter(pk__in=shuffiled_list).extra(select={"ordering": ordering }, order_by=("ordering", ))

Verwandte Fragen
Speisekarte