2010-01-11 110 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) 

希望这有助于! 此致,亚历克斯