Django管理站点未显示ManyToManyField关系

时间:2020-03-06 15:00:35  来源:igfitidea点击:

我正在研究我认为是相当标准的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页面创建该类的新实例。

我可能会发布另一个问题,以查看是否存在一种更好的方法来实现模型更改(因为我很确定那是造成我的问题的原因)而不擦除数据库。