2010-01-11 107 views
11

以下模型描述了Internet上引用該漏洞的漏洞和URL。假設每個URL只涉及1個漏洞,並且許多URL將討論該漏洞。這是佈置模型的正確方法嗎?Django一對多模型

class Vuln(models.Model): 
    pub_date = models.DateTimeField("Publication Date") 
    short_description = models.CharField("Description", max_length=70) 

    reference_urls = models.ForeignKey(Url, unique=True, blank=True, verbose_name="Reference URLs") 
    vendor = models.ForeignKey(Vendor, verbose_name="Vendor") 

class Url(models.Model): 
    url = models.URLField("URL", max_length=200) 

管理應用程序給參考URL提供了一個「選擇」框,這不是我想要的。當我添加一個新的漏洞對象時,已經輸入的所有現有URL都顯示在該下拉列表中,這又是不自然的。我覺得這應該與博客評論的行爲非常相似,即。該評論適用於單個博客條目而非其他博客條目,並且該博客條目可能有許多評論。我如何在Django模型中表達這一點?

+14

此外,作爲一種風格,最好使用'漏洞'作爲表名稱,而不是'漏洞' - 它更長,但至少你不認爲「到底是什麼是一個陰險的「就像我看到它時所做的那樣。 – LeafStorm 2010-01-11 12:01:01

回答

23

應該更多這樣的:

class Vuln(models.Model): 
    pub_date = models.DateTimeField("Publication Date") 
    short_description = models.CharField("Description", max_length=70) 
    vendor = models.ForeignKey(Vendor, verbose_name="Vendor") 

class Url(models.Model): 
    url = models.URLField("URL", max_length=200) 
    vulnerability = models.ForeignKey(Vuln) 

如果你說的有關特定漏洞的每個URL會談,那麼在Django的DBM的關係:)

至於供應商字段,您只需添加另一個類,就像Class Vuln一樣。例如:

class Vendor(models.Model): 
    field_names_go_here = models.TextField(max_length=70) 
    short_description = models.CharField("Description", max_length=70) 

希望這有助於! 此致,亞歷克斯