Python 创建与任意数量的其他模型相关的模型
我删除了我的上一个问题,因为它措辞糟糕,而且我的非工作示例令人困惑 我有一系列的型号,比如Python 创建与任意数量的其他模型相关的模型,python,django,inheritance,django-models,Python,Django,Inheritance,Django Models,我删除了我的上一个问题,因为它措辞糟糕,而且我的非工作示例令人困惑 我有一系列的型号,比如汽车,电脑,椅子,等等。我的目标是能够将任意数量的图像附加到每个图像上。这就是我的问题:实现这一点的最佳设计模式是什么 到目前为止,我尝试的是创建一个抽象模型,AttachedImage。然后,我继承此模型,并创建更具体的模型,如VehicleImage、ComputerImage或ChairImage。但这似乎不是正确的方法。正如我在对删除的问题的评论中提到的,正确的方法是使用 使您的AttachedIm
汽车
,电脑
,椅子
,等等。我的目标是能够将任意数量的图像附加到每个图像上。这就是我的问题:实现这一点的最佳设计模式是什么
到目前为止,我尝试的是创建一个抽象模型,
AttachedImage
。然后,我继承此模型,并创建更具体的模型,如VehicleImage
、ComputerImage
或ChairImage
。但这似乎不是正确的方法。正如我在对删除的问题的评论中提到的,正确的方法是使用
使您的AttachedImage模型具体化,但添加content\u type
和object\u id
字段和content\u object
GenericForeignKey。该content_object字段现在可以指向任何模型的实例
为了简化反向关系,您可以在车辆、计算机和座椅模型中添加GenericRelation访问器。正如我在对已删除问题的评论中提到的,正确的方法是使用 使您的AttachedImage模型具体化,但添加
content\u type
和object\u id
字段和content\u object
GenericForeignKey。该content_object字段现在可以指向任何模型的实例
为了简化反向关系,您可以将GenericRelation访问器添加到车辆、计算机和椅子模型中。如果您不想使用GenericForeignKey,可以使用多表继承实现您自己的多态模型。以下是针对同一问题的伪模型:
class Attachable(models.Model):
pass
class Image(models.Model):
attachable = models.ForeignKey(Attachable, related_name='images')
class Video(models.Model):
attachable = models.ForeignKey(Attachable, related_name='videos')
class Vehicle(Attachable):
vehicle attrs...
class Computer(Attachable):
computer attrs...
class Chair(Attachable):
chair attrs...
对于以后的优化,
Attachable
还可以有一个描述其子类型的属性。如果不想使用GenericForeignKey,可以使用多表继承实现自己的多态模型。以下是针对同一问题的伪模型:
class Attachable(models.Model):
pass
class Image(models.Model):
attachable = models.ForeignKey(Attachable, related_name='images')
class Video(models.Model):
attachable = models.ForeignKey(Attachable, related_name='videos')
class Vehicle(Attachable):
vehicle attrs...
class Computer(Attachable):
computer attrs...
class Chair(Attachable):
chair attrs...
对于以后的优化,
Attachable
还可以有一个描述其子类型的属性。多亏了Daniel Roseman的,我发现了。你可以找到一个很好的关于它们的概述和教程。基本上有两种方法可以实现这一点
第一个是使用泛型关系,如我链接的教程中所述。这个系统是非常通用和强大的,但在我的情况下,这将增加一个额外的复杂性,坦率地说,我不需要
如果你是一个有Django的新手,你可以考虑一个更直截了当但不那么“系统化”的模式,也在我链接的教程中详细说明:简单地为你希望你的主模型相关的每一个对象添加一个<代码>外键字段。下面是我在问题中使用的示例:
class AttachedImage(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User, on_delete=models.CASCADE)
image = models.ImageField(upload_to=image_path) # TO FIX: añadir la ruta
is_default = models.BooleanField(default=False)
为此,只需为需要的关系添加字段,例如:
parent_vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, null=True)
parent_computer = models.ForeignKey(Computer, on_delete=models.CASCADE, null=True)
parent_chair = models.ForeignKey(Chair, on_delete=models.CASCADE, null=True)
就像你经常使用的那样使用它们。不利的一面是最终得到了所有这些您并不真正需要的额外字段,但由于可以为空,它们不会占用太多空间。另一个缺点是,对大量的模型进行此操作可能有些过分,在这种情况下,您应该真正使用第一种解决方案。多亏了Daniel Roseman的,我发现了。你可以找到一个很好的关于它们的概述和教程。基本上有两种方法可以实现这一点 第一个是使用泛型关系,如我链接的教程中所述。这个系统是非常通用和强大的,但在我的情况下,这将增加一个额外的复杂性,坦率地说,我不需要
如果你是一个有Django的新手,你可以考虑一个更直截了当但不那么“系统化”的模式,也在我链接的教程中详细说明:简单地为你希望你的主模型相关的每一个对象添加一个<代码>外键字段。下面是我在问题中使用的示例:
class AttachedImage(models.Model):
uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(User, on_delete=models.CASCADE)
image = models.ImageField(upload_to=image_path) # TO FIX: añadir la ruta
is_default = models.BooleanField(default=False)
为此,只需为需要的关系添加字段,例如:
parent_vehicle = models.ForeignKey(Vehicle, on_delete=models.CASCADE, null=True)
parent_computer = models.ForeignKey(Computer, on_delete=models.CASCADE, null=True)
parent_chair = models.ForeignKey(Chair, on_delete=models.CASCADE, null=True)
就像你经常使用的那样使用它们。不利的一面是最终得到了所有这些您并不真正需要的额外字段,但由于可以为空,它们不会占用太多空间。另一个缺点是,对大量模型执行此操作可能有些过分,在这种情况下,您应该真正使用第一种解决方案。谢谢,我不知道泛型关系。谢谢,我不知道泛型关系。