将信息添加到 Django 中 ManyToMany 中引用的模型实例
Add info to model instance referenced in ManyToMany in Django
从一开始,我就觉得我缺少一些简单的东西 - 如果是这样,请指出正确的方向。以下是对我的问题的最少解释:
有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)
通过此设置,我们可以肯定地知道每个注释都有期刊参考,并且可能有文章参考,也可能没有。但是,现在可以为未在特定期刊上发表的文章添加注释并将其连接到该 'wrong' 期刊。看到这里我头晕目眩。
如何强制只能创建与期刊文章列表中的文章相关的新笔记? (也在 django 的管理中——理想情况下,下拉列表应该只显示来自所选期刊的文章)
另外,如何确保每个期刊+文章组合只有一个注释(+ 可能是一个没有任何相关文章的注释)?
这可以通过 表格 更容易地完成。
要确保只有 模型 级别的有效选项,需要额外的工作。
因此,我推荐这个优秀的第 3 方包:
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。
从一开始,我就觉得我缺少一些简单的东西 - 如果是这样,请指出正确的方向。以下是对我的问题的最少解释:
有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)
通过此设置,我们可以肯定地知道每个注释都有期刊参考,并且可能有文章参考,也可能没有。但是,现在可以为未在特定期刊上发表的文章添加注释并将其连接到该 'wrong' 期刊。看到这里我头晕目眩。
如何强制只能创建与期刊文章列表中的文章相关的新笔记? (也在 django 的管理中——理想情况下,下拉列表应该只显示来自所选期刊的文章)
另外,如何确保每个期刊+文章组合只有一个注释(+ 可能是一个没有任何相关文章的注释)?
这可以通过 表格 更容易地完成。
要确保只有 模型 级别的有效选项,需要额外的工作。
因此,我推荐这个优秀的第 3 方包: 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。