2009-10-17 61 views
2

我正在尝试为文章网站创建模型。我想每篇文章3-5篇相关链接,所以我在想什么是创造这样的代码:Django:使模型具有未定义数量的字段

class Article (models.Model): 
    # Tiny url 
    url = models.CharField(max_length = 30, unique=True) 
    is_published = models.BooleanField() 
    author = models.CharField(max_length = 150) 
    title = models.CharField(max_length = 200) 
    short_description = models.TextField(max_length = 600) 
    body = tinymce_models.HTMLField() 
    related1 = models.ForeignKey(Article) 
    related2 = models.ForeignKey(Article) 
    related3 = models.ForeignKey(Article) 

但不能肯定是否有可能使一个外键关系到相同型号。另外,如果例如,我会决定将6,7篇文章绑定在一起,这将如何工作,我是否必须在模型中写入相关的4,5,6 ...?我想有更通用的解决方案,所以如果我绑定更多的文章,我不需要重新定义代码一次又一次

我在想的不是扩展与相关领域的文章模型..(它看起来丑陋) 也许值得创建另一个模型? 例如:ArticleSet

但如何定义那里无限制列表(没有项目的限制)..你能提出一种方法吗?

在此先感谢

回答

5

您需要使用ManyToManyField这种关系。

例如:

class Article (models.Model): 
    # rest of fields up to and including body 
    related_articles = models.ManyToManyField("self") 
+0

在这种情况下,有限制数量为5的方法吗? – 2009-10-17 16:10:16

+0

刚刚尝试过:)这真的很酷!我想知道如何查看与当前视图相关的所有文章?也可以很好地过滤可用的相关文章列表:( – 2009-10-17 18:55:10

+0

我不知道格式是否可以在这里工作...
{%for rel_art in cur_art.related_articles%}
&lta href =“{ {rel_art.url}}“> {{rel_art.title}}< a>
{%endfor%} – 2009-10-17 19:38:21

4

基本上多对多可以作为数组进行处理。所以在模板中,你可以做这样的事情:

{% for rel_art in cur_art.related_articles.all %} 
    <a href="{{rel_art.url}}">{{rel_art.title}}</a> 
{% endfor %} 

在更广泛的说明,Django docs(和免费在线Django Book)都一样好,因为它在FOSSland得到。我强烈建议喝一杯好咖啡并认真阅读。通过阅读Django代码本身也可以学到很多好东西 - 它的结构良好并且评论得很好。即使通过一个简单的应用程序,如django.contrib.flatpages,也会给你一些真正的见解,你可以用它做什么。

+0

感谢加入'.all',卡尔,我正在处理一个啤酒障碍。 – 2009-10-18 18:30:56