Python Django中的泛型一对一关系
我需要建立一对一的关系,这也必须是通用的。也许你能给我一个更好的设计建议。到目前为止,我提出了以下模型Python Django中的泛型一对一关系,python,django,django-models,django-admin,one-to-one,Python,Django,Django Models,Django Admin,One To One,我需要建立一对一的关系,这也必须是通用的。也许你能给我一个更好的设计建议。到目前为止,我提出了以下模型 class Event(models.Model): # skip event related fields... content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = gen
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):...
类事件(models.Model):
#跳过与事件相关的字段。。。
content\u type=models.ForeignKey(ContentType)
object_id=models.PositiveIntegerField()
content\u object=generic.GenericForeignKey('content\u type','object\u id')
类元:
unique\u-together=('content\u-type','object\u-id')
类Action1(models.Model):
#跳过操作1相关字段。。。
events=generic.GenericRelation(事件,内容\u类型\u字段='content\u类型',对象\u id\u字段='object\u id')
@财产
def事件(自):
返回self.events.get()。您所做的很好,但是您可以通过创建一个透明地反转关系的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)
...
及
您可能也希望将缓存添加到反向关系中使用.get()
如果对象不存在,则返回raise,.first()
如果对象不存在,则返回None
名称事件\u关系
是区分事件
和事件
的一种优雅方式
类事件(models.Model):
content\u type=models.ForeignKey(ContentType)
object_id=models.PositiveIntegerField()
content\u object=generic.GenericForeignKey('content\u type','object\u id')
类元:
unique_-together=('content_-type','object_-id')#重要
类Action1(models.Model):
事件\关系=泛型。泛型关系(事件)
@财产
def事件(自):
#返回存在中的对象
#没有别的
返回self.events\u relation.first()
Its运行良好,但它没有提供这样做的能力:Action.objects。选择相关('event')
我不喜欢这个解决方案->agenerirelation
看起来更好,即使你需要使用self.events.get()
或self.events.first()
与上面的注释相同。您最初使用的genericorrelation
要好得多。如果您确实想避免事件
,则需要手动实现对事件
表的查询,如下所示。我仍然希望将events
作为一般关系,然后在event
属性中使用self.events.first()
。此外,这将更容易让您在将来删除唯一约束。
action = Action1.object.get(id=1)
event = action.get_event