簡體   English   中英

創建與任意數量的其他模型相關的模型

[英]Creating a model related to an arbitrary number of other models

我刪除了我之前的問題,因為它的措辭太糟糕了,而且我的非工作示例令人困惑。

我有一系列模型,例如VehicleComputerChair和whatnot。 我的目標是能夠在每個圖像上附加任意數量的圖像。 這是我的問題:實現這一目標的最佳設計模式是什么?

到目前為止,我已經嘗試創建一個抽象模型AttachedImage 然后,我從該模型繼承,並創建更多特定的模型,例如VehicleImageComputerImageChairImage 但這並不適合追求這一目標。

正如我在已刪除問題的評論中提到的那樣,正確的方法是使用一般關系

使您的AttachedImage模型具體,但添加content_typeobject_id字段以及content_object GenericForeignKey。 現在,那個content_object字段可以指向任何模型的實例。

為了使反向關系更容易,您可以將GenericRelation訪問器添加到Vehicle,Computer和Chair模型中。

如果您不想使用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的新手,則可以考慮采用一種更為簡單但又不太“系統化”的模式,該模式在我鏈接的教程中也有詳細介紹:只需為您想要主對象的每個對象添加一個ForeignKey字段要關聯的模型。 按照我在問題中使用的示例:

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)

然后像平常一樣使用它們。 不利的一面是所有您實際上不需要的額外字段結束,但是這些字段可以為空,因此不會占用太多空間。 另一個缺點是,使用大量模型執行此操作可能會過大,在這種情況下,您應該真正使用第一個解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM