Общее отношение "один к одному" в Django
мне нужно настроить отношение "один к одному", которое также должно быть общим. Может быть, вы можете посоветовать мне лучший дизайн. До сих пор я подошел к следующим моделям
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):...
в Django Admin В списке событий я хочу собрать все действия, и оттуда я хочу перейти на страницы администратора для действий. Можно ли избежать создания event
свойство в моделях действий? Есть ли лучшее решение? Было бы неплохо объединить поле events
и администрацией event
в одном определении. Проект я работаю с использует Джанго 1.1
1 ответов
недавно . То, что вы сделали, прекрасно, но вы можете обобщить его немного больше, создав миксин, который прозрачно меняет отношения:
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
вы можете добавить кэширование в обратное отношение тоже