将信息添加到Django

时间:2015-12-05 01:34:18

标签: python django database-design database-schema

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

有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可能只与Journal连接,而不是任何文章 - 在这种情况下,它将代表一个问题前言。到目前为止,我有这个:

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

通过此设置,我们确信每个Note都有Journal引用,并且可能有文章引用。但是,现在可以为未在某个期刊上发表的文章添加注释,并将其连接到该“错误”期刊。在这里,我的头旋转。

如何强制创建新笔记只能与期刊文章列表中的文章相关联? (同样在django的管理员中 - 理想情况下,下拉列表应仅显示所选期刊中的文章)

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

1 个答案:

答案 0 :(得分:1)

通过表单可以更轻松地完成此操作。

要确保模型级别的唯一有效选项,需要额外的工作。

因此,我推荐这个优秀的第三方套餐: 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。