Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中的泛型一对一关系_Python_Django_Django Models_Django Admin_One To One - Fatal编程技术网

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')
我不喜欢这个解决方案->a
generirelation
看起来更好,即使你需要使用
self.events.get()
self.events.first()
与上面的注释相同。您最初使用的
genericorrelation
要好得多。如果您确实想避免
事件
,则需要手动实现对
事件
表的查询,如下所示。我仍然希望将
events
作为一般关系,然后在
event
属性中使用
self.events.first()
。此外,这将更容易让您在将来删除唯一约束。
action = Action1.object.get(id=1)
event = action.get_event