Ответ 1
Я недавно столкнулся с этой проблемой. То, что вы сделали, прекрасно, но вы можете обобщить его немного больше, создав mixin, который трансформирует отношения прозрачно:
class Event(models.Model):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
class Meta:
unique_together = ('content_type', 'object_id')
class EventMixin(object):
@property
def get_event(self):
ctype = ContentType.objects.get_for_model(self.__class__)
try:
event = Event.objects.get(content_type__pk = ctype.id, object_id=self.id)
except:
return None
return event
class Action1(EventMixin, models.Model):
# Don't need to mess up the models fields (make sure the mixing it placed before models.Model)
...
и
action = Action1.object.get(id=1)
event = action.get_event
Возможно, вы захотите добавить кеширование в обратную связь.