tags:

views:

33

answers:

2

I have a model with a generic relation:

TrackedItem --- genericrelation ---> any model

I would like to be able to generically get, from the initial model, the tracked item.

I should be able to do it on any model without modifying it.

To do that I need to get the content type and the object id. Getting the object id is easy since I have the model instance, but getting the content type is not: ContentType.object.filter requires the model (which is just content_object.__class__.__name__) and the app_label.

I have no idea of how to get in a reliable way the app in which a model is.

For now I do app = content_object.__module__.split(".")[0], but it doesn't work with django contrib apps.

+2  A: 

The app_label is available as an attribute on the _meta attribute of any model.

from django.contrib.auth.models import User
print User._meta.app_label
# The object name is also available
print User._meta.object_name
Wogan
+1, even if I don't use it, it's good to know.
e-satis
+1  A: 

You don't need to get the app or model just to get the contenttype - there's a handy method to do just that:

ContentType.objects.get_for_model(myobject)

Despite the name, it works for both model classes and instances.

Daniel Roseman
This is a better solution than using _meta.
Wogan