Django-Modelle: Liste der ID abrufen

77

Wie erhalte ich eine Liste aller IDs / Primärschlüssel für eine Tabelle? Angenommen, ich habe diese Tabelle:

class Blog(models.Model)
  title = models.CharField()
  body = models.CharField()
  author = models.ForeignKey(Author)

übernimmt das Feld Autor ist ein Autor Objekt. Ich möchte alle IDs von Blog erhalten, wobei author = author

Ich weiß, ich kann verwenden

    blogs = Blog.objects.filter(author=author)

und alle Blog-Objekte in einer Listenform erhalten, aber wie erhalte ich die Liste IDS / PK? Ähnlich wie "ID aus Blog auswählen, wobei Autor = Autor"

ibaguio
quelle
Ich bin neugierig, warum du das willst? Normalerweise beschäftigen Sie sich nicht mit dem Primärschlüssel, wie er von Django verwaltet wird.
Burhan Khalid
@ Burhan es ist ein bisschen kompliziert, ich muss die Liste der PK / ID für eine andere Abfrage verwenden, w / c ist so etwas wie not_authored_blog = Author.objects.exclude(blog__id__in=blogs). Ich habe eine andere Tabelle, die FK hat, um zu "bloggen" und möchte die Objekte in der anderen Tabelle erhalten, die nicht FK in "Blog" ist. komplizierter als das
ibaguio
Sie können dies umgehen, indem Sie überprüfen, ob der blog_setzugehörige Manager über Datensätze verfügt. Wenn es leer ist, hat dieser Autor keine Blogs. Es ist viel besser als Ihre Ausschlussabfrage, die möglicherweise als große NOT INKlausel übersetzt wird.
Burhan Khalid

Antworten:

134

Sie können dies mit der values_listMethode tun .

blogs = Blog.objects.filter(author=author).values_list('id', flat=True)

Weitere Informationen finden Sie in der Dokumentation zum Django-Abfrageset .

Stepan Grigoryan
quelle
1
Gibt es eine Möglichkeit, diese IDs abzurufen, ohne das zurückkehrende Abfrageset zu analysieren? Ich erhalte <QuerySet [13, 14, 15]> und möchte diese Liste von IDs. Gibt es eine pythonische Methode, um ein Durchlaufen der Zeilen zu vermeiden?
RuBiCK
Die Listenmethode ruft IDs ab, ohne das zurückgebende Abfrageset zu analysieren. print (Liste (IDs))
Sahir Saiyed
64
Blog.objects.filter(author=author).values_list('id', flat=True)

values_list()Gibt eine Liste von Zeilen an, wobei jede Zeile der Reihe nach ein Tupel aller Felder enthält, die Sie als Argumente angeben. Wenn Sie nur ein einzelnes Feld als Argument übergeben, können Sie auch angeben flat=True, dass anstelle einer Liste von Tupeln eine einfache Liste abgerufen werden soll.

Andrew Gorcester
quelle
22
Es ist am besten, pkstattdessen zu verwenden id, da der interne Wert pkimmer auf das Primärschlüsselfeld verweist, auch wenn es nicht "id" heißt.
Burhan Khalid
5
Blog.objects.filter(author=author).values_list('pk', flat=True)

Setzen Sie pkstattdessen idnur für Best Practices.

Jorge Alberto
quelle
0

values_listEs gibt Tupel zurück, wenn es wiederholt wird. Jedes Tupel enthält den Wert aus dem jeweiligen Feld oder Ausdruck, der an die values_list () übergeben wird.

author = Blog.objects.filter(author=author)
ids    = author.values_list('pk', flat=True)

# list method get ids without parse the returning queryset

print(list(ids))
Sahir Saiyed
quelle