2012-10-03 25 views
7

Estoy trasladando un proyecto de Rails a Django con una base de datos heredada. En Rails tuve una asociación polimórfica que me permitió agregar una nota al pie a cualquier fila en la base de datos. Estoy tratando de implementar lo mismo en la aplicación Django. Encontré la documentación sobre Relaciones genéricas y se ve perfecto. Desafortunadamente, primero necesito crear nuevos campos en mi base de datos heredada para mantener el ID de ContentType para los modelos relevantes. Solo utilicé la asociación polimórfica con 2 tablas, así que todo lo que necesito son esos dos identificadores correspondientes de la aplicación Django, pero parece que no puedo encontrar el comando apropiado para buscar una ID de ContentType en Django.Obtener ID de ContentType en Django para la relación genérica

Cualquier sugerencia es bienvenida. Traté de buscar en las preguntas anteriores, pero no pude encontrar lo que estoy buscando. Muchas gracias por su tiempo y ayuda.

Respuesta

11

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

que puede hacer:

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

por lo que sólo una instancia de una instancia de su modelo y luego hacer ContentType.objects.get_for_model(<instance>).id

Creo que hay una manera de pasar simplemente el nombre del modelo, también ... avíseme si eso funcionaría mejor y trataré de encontrarlo; Lo he usado en el pasado.

+0

¡Gracias! Parece que podría haber obtenido la respuesta que necesitaba antes, simplemente no me di cuenta. ¿Los ID ContentType suelen ser cadenas? A cada número le sigue una 'L' - content_type_id para Letter es "43L" para la asignación es "44L". –

+0

Así que todavía no sé qué pasa con la 'L', pero hice lo que debería haber hecho en primer lugar y fui a la base de datos subyacente para mirar la tabla. Efectivamente, los números que obtengo son correctos, pero la L no se encuentra por ningún lado. Extraño. ¡Pero muchas, muchas gracias! –

+0

La L es una cosa muy molesta de Django: el tipo de id es "long int" en el db, por lo que en algunas circunstancias sale con la L añadida. Si lo convierte en int ('int (44L)'), debe obtener 44. – Colleen

3

También puede obtener ContentType ID sin crear una instancia, que es más eficiente si no tiene y no necesita una instancia, pero solo desea obtener ContentType ID por nombre de modelo.

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

Notas: si el nombre del modelo es mayúscula, por favor utilice minúsculas para la búsqueda. Por ejemplo: modelo = 'marcador' en lugar de 'Marcador'

Cuestiones relacionadas