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)
换句话说,一个项目可以具有不同的Tech对象,并且不同的Tech对象可以属于不同的Project(Project X是使用Python和Django创建的,Project Y是Cand SQL Server的)
但是,管理站点不会显示Tech对象的任何UI。这是我的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"列表中,但这给出了一个
no such table: projects_project_techs
错误。我验证了,没有projects_project_techs
表,但是有projects_tech
表。可能是我的syncdb搞砸了吗?
如果有帮助,我正在使用Sqlite作为数据库。
解决方案
I've tried adding the TechInline class to the inlines list, but that causes a 'TechInLine' not defined
这是直接复制粘贴吗?看起来我们刚刚输入了错字,而不是TechInLine
,所以尝试了TechInline
。
如果syncdb没有创建正确的表,则可以手动进行操作。执行以下命令:
python manage.py sqlreset <myapp>
然后寻找" projects_project_techs"表的定义。将其复制并粘贴到数据库的客户端中。
假设应用程序名为" projects",那么techs表的默认名称将为projects_tech,projects表的名称将为projects_project。
多对多表应类似于projects_project_techs
@John Millikin感谢sqlreset技巧,这使我走上了正确的道路。 sqlreset生成的代码向我显示了从未真正创建projects_project_techs
的代码。我最终只是删除了deb.db数据库并重新生成了它。然后出现了"技术"。
作为一个旁注,我还必须执行一个admin.site.register(Tech)才能从Project页面创建该类的新实例。
我可能会发布另一个问题,以查看是否存在一种更好的方法来实现模型更改(因为我很确定那是造成我的问题的原因)而不擦除数据库。