0

我已经启动了一个博客应用程序。该模型如下所示:

from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=512)
    image = models.ImageField(upload_to='/pathto/blogImages')
    body = models.TextField()
    visible = models.BooleanField()
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.title

class Tag(models.Model):
    keyword = models.CharField(max_length=256)
    posts = models.ManyToManyField(Post)

    def __unicode__(self):
        return self.keyword

运行 syncdb 后,我创建了一个 admin.py 文件,如下所示:

from blog.models import Post
from blog.models import Tag
from django.contrib import admin

class TagInline(admin.TabularInline):
    model = Tag
    extra = 3

class PostAdmin(admin.ModelAdmin):
    inlines = [TagInline]

admin.site.register(Post, PostAdmin)

当我访问管理区域(http://localhost:8000/admin/blog/post/add/)时,我收到以下错误:

Exception at /admin/blog/post/add/
<class 'blog.models.Tag'> has no ForeignKey to <class 'blog.models.Post'>
Request Method: GET
Request URL:    http://localhost:8000/admin/blog/post/add/
Django Version: 1.4.1
Exception Type: Exception
Exception Value:    
<class 'blog.models.Tag'> has no ForeignKey to <class 'blog.models.Post'>
Exception Location: /usr/local/lib/python2.7/dist-packages/django/forms/models.py in _get_foreign_key, line 800
Python Executable:  /usr/bin/python
Python Version: 2.7.3

当我在 django 中查找多对五关系时,我发现https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/。我一直无法找到我缺少的东西。如何避免错误?

4

3 回答 3

1

当您处理多对多关系时,您InlineModelAdmin应该如下所示

class TagInline(admin.TabularInline):
    model = Tag.posts.through
于 2012-10-08T06:05:28.927 回答
0

您的多对多字段应该在帖子模型而不是标签模型上。对象必须按顺序定义,否则您必须使用 models.ManyToManyField('tag') 除非不可避免,否则不建议这样做。所以先定义标签然后发布,这样你就可以在发布模型下使用(标签)。我建议只使用 django 标记。它一直对我很有帮助。

毕竟,让 django 如此吸引人的是可重用的应用程序和快速的开发。

于 2012-10-08T09:01:47.767 回答
0

也许您可以尝试将帖子的模型字段设置为

posts = models.ManyToManyField(Post, null=True, blank=True).

我猜可能没有创建帖子,因此它无法创建标签或将标签与帖子“连接”。

于 2012-10-08T02:04:13.940 回答