2012-10-03 7 views
7

Ich portiere ein Projekt von Rails nach Django mit einer Legacy-Datenbank. In Rails hatte ich eine polymorphe Assoziation, die es mir erlaubte, jeder Zeile in der Datenbank eine Fußnote hinzuzufügen. Ich versuche das Gleiche in der Django App zu implementieren. Ich habe die Dokumentation zu Generic Relations gefunden und sie sieht perfekt aus. Leider muss ich zuerst neue Felder in meiner Legacy-Datenbank erstellen, um die ContentType-ID für die relevanten Modelle zu speichern. Ich habe nur die polymorphe Assoziation mit 2 Tabellen verwendet, also brauche ich nur die zwei entsprechenden IDs aus der Django-App, aber ich finde nicht den passenden Befehl, um eine ContentType-ID in Django nachzuschlagen.Get ContentType-ID in Django für generische Beziehung

Alle Vorschläge sind sehr willkommen. Ich habe versucht, vorherige Fragen zu durchsuchen, konnte aber nicht finden, wonach ich suche. Vielen Dank für Ihre Zeit und Hilfe.

Antwort

11

von https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey

können Sie tun:

>>> b = Bookmark.objects.get(url='https://www.djangoproject.com/') 
>>> bookmark_type = ContentType.objects.get_for_model(b) 
>>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id, 
...       object_id=b.id) 

so nur eine Instanz des Modells instanziiert und tun dann ContentType.objects.get_for_model(<instance>).id

Ich denke, ein Weg, es gibt nur die Modellnamen zu übergeben, zu ... lass es mich wissen, wenn das besser funktionieren würde und ich werde versuchen es zu finden; Ich habe es in der Vergangenheit benutzt.

+0

Vielen Dank! Es sieht so aus, als ob ich die Antwort bekommen hätte, die ich vorher brauchte, ich habe es einfach nicht bemerkt. Sind ContentType-IDs normalerweise Zeichenfolgen? Auf jede Zahl folgt eine "L" - content_type_id für den Buchstaben "43L", für die Zuordnung ist "44L". –

+0

Also weiß ich immer noch nicht, was mit dem 'L' los ist, aber ich habe einfach getan, was ich hätte tun sollen und ging in die zugrunde liegende Datenbank, um den Tisch zu betrachten. Sicher, die Zahlen, die ich bekommen habe, sind korrekt, aber das L ist nirgendwo zu finden. Seltsam. Aber vielen, vielen Dank! –

+0

Das L ist eine sehr nervige Django-Sache - der ID-Typ ist "long int" in der db, unter bestimmten Umständen kommt es daher mit dem L-Anhang heraus. Wenn Sie es in einen int (int (44L) ') umwandeln, sollten Sie 44 erhalten. – Colleen

3

Sie können ContentType ID auch abrufen, ohne eine Instanz erstellen zu müssen. Dies ist effizienter, wenn Sie keine Instanz haben und nicht benötigen, ContentType-ID jedoch nur anhand des Modellnamens abrufen möchten.

ContentType.objects.get(model='bookmark').id

Hinweise: Wenn der Name Ihres Modells oberer Fall ist, bitte Kleinschreibung verwenden zu suchen. Zum Beispiel: model = 'Lesezeichen' statt 'Lesezeichen'