2012-10-03 15 views
7

Przenoszę projekt z Rails do Django ze starszej bazy danych. W Railsach miałem polimorficzne powiązanie, które pozwoliło mi dodać przypis do dowolnego wiersza w bazie danych. Próbuję zaimplementować to samo w aplikacji Django. Znalazłem dokumentację na temat Generic Relations i wygląda idealnie. Niestety najpierw muszę utworzyć nowe pola w mojej starszej bazie danych, aby zachować identyfikator ContentType dla odpowiednich modeli. Użyłem tylko polimorficznego skojarzenia z 2 tabelami, więc potrzebuję tylko tych dwóch odpowiednich identyfikatorów z aplikacji Django, ale nie mogę znaleźć odpowiedniego polecenia do wyszukiwania identyfikatora ContentType w Django.Uzyskaj identyfikator ContentType w Django dla ogólnej relacji

Wszelkie sugestie są mile widziane. Próbowałem przeszukiwać poprzednie pytania, ale nie mogłem znaleźć tego, czego szukam. Dziękuję bardzo za czas i pomoc.

Odpowiedz

11

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

można zrobić:

>>> 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) 

więc po prostu instancję instancji modelu, a następnie wykonaj ContentType.objects.get_for_model(<instance>).id

myślę, że istnieje sposób, aby przekazać tylko nazwa modelu, zbyt ... daj mi znać, jeśli to zadziała lepiej, a ja spróbuję to znaleźć; Używałem go w przeszłości.

+0

Dzięki! Wygląda na to, że mogłem uzyskać odpowiedź, której potrzebowałem wcześniej, po prostu nie zdawałem sobie z tego sprawy. Czy ContentType ids to typowe ciągi? Po każdym numerze występuje "L" - content_type_id dla litery "43L" dla przypisania "44L". –

+0

Więc nadal nie wiem, co jest grane z literą "L", ale właśnie zrobiłem to, co powinienem był zrobić i wszedłem do bazowej bazy danych, aby spojrzeć na stół. Rzeczywiście, liczby, które otrzymywałem, są poprawne, ale L nigdzie nie można znaleźć. Dziwne. Ale wiele, wiele dzięki! –

+0

L jest bardzo irytującym typem Django - typ id to "long int" w db, więc w pewnych okolicznościach wychodzi z dołączonym L. Jeśli rzucisz go na int ('int (44L)'), powinieneś otrzymać 44. – Colleen

3

Identyfikator ContentType można również uzyskać bez tworzenia instancji, która jest bardziej wydajna, jeśli nie ma i nie potrzebuje instancji, ale po prostu chce uzyskać identyfikator ContentType według nazwy modelu.

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

Uwagi: Jeśli nazwa modelu jest wielkimi literami, należy używać małych liter, aby szukać. Na przykład: model = 'zakładka' zamiast "Zakładka"

Powiązane problemy