【问题标题】:Add info to model instance referenced in ManyToMany in Django将信息添加到 Django 中的 ManyToMany 中引用的模型实例
【发布时间】:2016-03-10 02:08:08
【问题描述】:

从一开始,我就觉得我错过了一些简单的东西 - 如果是这样,请指出我正确的方向。以下是对我的问题的最小解释:

有 Journal、Article 和 Note 的模型,最后一个代表已发表文章的编者注。文章可以完全不发表,可以发表在多个期刊上;也很明显期刊可以发表多篇文章。所以首先我们有:

class Article(models.Model):
    (author, date of creation, actual text, etc)

class Journal(models.Model):
    (edition number, title, staff, etc)
    articles = models.ManyToManyField(Article)

到目前为止,它是标准的。现在我需要能够在已发表的文章中添加注释——比如说简短的评论或编辑的评论。 Note 需要连接到单个已发表的文章和某个期刊(同一篇文章在不同期刊中可以有不同的注释)。最后,Note 可能仅与 Journal 相关联,而不与任何 Article 相关联——在这种情况下,它代表一个问题的前言。到目前为止,我有这个:

class Note(models.Model):
    journal = models.ForeignKey(Journal)
    article = models.ForeignKey(Article, null=True, blank=True)
    text = models.TextField()
    (other stuff, irrelevant)

通过此设置,我们可以确定每个 Note 都有期刊参考,并且可能有文章参考。但是,现在可以为未在某个期刊上发表的文章添加注释并将其连接到那个“错误”的期刊。在这里我头晕目眩。

如何强制创建新注释只能与期刊文章列表中的文章相关联? (也在 django 的管理员中 - 理想情况下,下拉列表应该只显示来自所选期刊的文章)

另外,如何确保每个期刊+文章组合只有一个注释(+ 可能一个没有任何关联的文章)?

【问题讨论】:

    标签: python django database-design database-schema


    【解决方案1】:

    这可以通过表单更轻松地完成。

    为确保只有 Model 级别的选项有效,需要额外的工作。

    因此,我推荐这个优秀的 3rd 方包: django-smart-selects

    自述文件中的示例。

    from smart_selects.db_fields import ChainedForeignKey 
    
    class Location(models.Model):
        continent = models.ForeignKey(Continent)
        country = ChainedForeignKey(
            Country, 
            chained_field="continent",
            chained_model_field="continent", 
            show_all=False, 
            auto_choose=True
        )
        area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
        city = models.CharField(max_length=50)
        street = models.CharField(max_length=100)
    

    我在生产中使用它,效果很好。我确实建议设置 JQUERY 设置以使用更新版本的 jQuery。

    【讨论】:

    • 注意:如果你使用的是 Django 1.9,你必须创建一个尚未被包维护者接受的small change
    • 令我惊讶的是,这样的第 3 方库的存在表明我的问题实际上是有效的,并且其他人也有类似的需求。我有点假设有一个我想念的数据库/框架功能。感谢您指出这个项目,它应该会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2019-01-30
    • 2018-03-23
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多