Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.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 创建与任意数量的其他模型相关的模型_Python_Django_Inheritance_Django Models - Fatal编程技术网

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)

就像你经常使用的那样使用它们。不利的一面是最终得到了所有这些您并不真正需要的额外字段,但由于可以为空,它们不会占用太多空间。另一个缺点是,对大量模型执行此操作可能有些过分,在这种情况下,您应该真正使用第一种解决方案。

谢谢,我不知道泛型关系。谢谢,我不知道泛型关系。