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