【问题标题】:Django One-To-Many ModelsDjango 一对多模型
【发布时间】:2011-01-03 15:23:14
【问题描述】:

以下模型描述了一个漏洞以及 Internet 上引用该漏洞的 URL。假设每个 URL 只讨论 1 个漏洞,并且许多 URL 将讨论该漏洞。这是布置模型的正确方法吗?

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 都会显示在该下拉列表中,这又是不自然的。我觉得这应该与博客评论的行为非常相似,即。该评论适用于单个博客条目,而不是其他条目,并且一个博客条目可能有许多 cmets。如何在 Django 模型中表达这一点?

【问题讨论】:

  • 另外,就风格而言,最好使用Vulnerability 作为表名,而不是Vuln - 它更长,但至少你不认为“什么哎呀是个漏洞”,就像我在你看到它时所做的那样。

标签: python django model one-to-many


【解决方案1】:

应该更像这样:

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 中就有你的关系 :)

至于 vendor 字段,您只需添加另一个类,就像 Class Vuln 一样。例如:

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

希望这会有所帮助! 问候,亚历克斯

【讨论】:

    猜你喜欢
    • 2019-09-15
    • 2023-04-06
    • 2014-11-09
    • 2020-05-04
    • 2021-03-17
    • 2012-03-24
    • 2016-07-17
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多