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页面创建该类的新实例。
我可能会发布另一个问题,以查看是否存在一种更好的方法来实现模型更改(因为我很确定那是造成我的问题的原因)而不擦除数据库。

