Django 管理站点未显示 ManyToManyField 关系
我正在做一个我认为很标准的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 个回答
假设你的应用叫做“projects”,那么你用来存放技术信息的表格默认名称会是 projects_tech,而存放项目的表格名称会是 projects_project。
用于连接这两个表的多对多关系表格可以命名为 projects_project_techs。
@John Millikin - 谢谢你提到的sqlreset技巧,这让我找到了正确的方向。sqlreset生成的代码让我发现,projects_project_techs
这个表其实根本没有被创建。我最后选择删除了我的deb.db数据库,然后重新生成了它。这样一来,techs
就正常显示出来了。
顺便提一下,我还需要做一个admin.site.register(Tech)
的操作,这样才能在项目页面上创建这个类的新实例。
我可能会再发一个问题,想看看有没有更好的方法来实现模型的更改(因为我很确定这就是导致我问题的原因),而不需要清空数据库。
我试着把 TechInline 类加到 inlines 列表里,但这样会导致
'TechInLine' 未定义
这是直接复制粘贴吗?看起来你只是打错字了——试试用 TechInline
,而不是 TechInLine
。
如果你的 syncdb 没有创建正确的表,你可以手动来做。执行这个命令:
python manage.py sqlreset <myapp>
然后找一下 projects_project_techs
表的定义。把它复制粘贴到你的数据库客户端里。