urls tutorial template example desde cero python django django-models django-admin one-to-one

python - tutorial - httpresponse django example



Relación genérica uno a uno en Django (1)

Necesito establecer una relación uno a uno que también debe ser genérica. Tal vez puedas aconsejarme un mejor diseño. Hasta ahora he llegado a los siguientes modelos.

class Event(models.Model): # skip event related fields... 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 Action1(models.Model): # skip action1 related fields... events = generic.GenericRelation(Event, content_type_field=''content_type'', object_id_field=''object_id'') @property def event(self): return self.events.get() # <<<<<< Is this reasonable? class Action2(models.Model):...

En Django Admin en la lista de eventos quiero recopilar todas las acciones y, desde allí, quiero ir a las páginas de administración para ver las acciones. ¿Es posible evitar la creación de propiedades de event en los modelos de acción? ¿Hay una solución mejor? Sería bueno combinar los events campo y el event propiedad en una sola definición. El proyecto con el que estoy trabajando usa Django 1.1.


Recientemente me encontré con este problema . Lo que has hecho está bien, pero puedes generalizarlo un poco más creando una mezcla que invierta la relación de manera transparente:

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

y

action = Action1.object.get(id=1) event = action.get_event

Es posible que desee agregar caché a la relación inversa también