Django 管理站点未显示 ManyToManyField 关系

4 投票
3 回答
5737 浏览
提问于 2025-04-11 09:29

我正在做一个我认为很标准的Django网站,但在让我的管理界面显示正确的字段时遇到了麻烦。

这是我的models.py文件:

class Tech(models.Model):
    name = models.CharField(max_length = 30)

class Project(models.Model):
    title = models.CharField(max_length = 50)
    techs = models.ManyToManyField(Tech)

换句话说,一个项目可以有不同的技术对象,而不同的技术对象可以属于不同的项目(比如项目X是用Python和Django创建的,项目Y是用C#和SQL Server创建的)。

然而,管理网站没有显示任何技术对象的界面。以下是我的admin.py文件:

class TechInline(admin.TabularInline):
    model = Tech
    extra = 5

class ProjectAdmin(admin.ModelAdmin):
    fields = ['title']
    inlines = []
    list_display = ('title')

admin.site.register(Project, ProjectAdmin)

我尝试把TechInline类添加到inlines列表中,但这导致了一个

<class 'home.projects.models.Tech'> has no ForeignKey to <class 'home.projects.models.Project'>

错误。此外,我还尝试把techs添加到fields列表中,但这又出现了一个

没有这样的表:projects_project_techs

错误。我确认过,确实没有projects_project_techs这个表,但有一个projects_tech的表。我的syncdb是不是出了什么问题?

我使用的是Sqlite作为我的数据库,如果这有帮助的话。

3 个回答

0

假设你的应用叫做“projects”,那么你用来存放技术信息的表格默认名称会是 projects_tech,而存放项目的表格名称会是 projects_project。

用于连接这两个表的多对多关系表格可以命名为 projects_project_techs。

0

@John Millikin - 谢谢你提到的sqlreset技巧,这让我找到了正确的方向。sqlreset生成的代码让我发现,projects_project_techs这个表其实根本没有被创建。我最后选择删除了我的deb.db数据库,然后重新生成了它。这样一来,techs就正常显示出来了。

顺便提一下,我还需要做一个admin.site.register(Tech)的操作,这样才能在项目页面上创建这个类的新实例。

我可能会再发一个问题,想看看有没有更好的方法来实现模型的更改(因为我很确定这就是导致我问题的原因),而不需要清空数据库。

3

我试着把 TechInline 类加到 inlines 列表里,但这样会导致

'TechInLine' 未定义

这是直接复制粘贴吗?看起来你只是打错字了——试试用 TechInline,而不是 TechInLine

如果你的 syncdb 没有创建正确的表,你可以手动来做。执行这个命令:

python manage.py sqlreset <myapp>

然后找一下 projects_project_techs 表的定义。把它复制粘贴到你的数据库客户端里。

撰写回答