代码之家  ›  专栏  ›  技术社区  ›  swilliams

Django管理站点未显示ManyToManyField关系

  •  3
  • swilliams  · 技术社区  · 16 年前

    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)

    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_tech

    3 回复  |  直到 16 年前
        1
  •  3
  •   John Millikin    16 年前

    我尝试将TechInline类添加到inlines列表中,但这会导致

    未定义“TechInLine”

    那是直接复制粘贴吗?看起来你刚刚打错了--试试看 TechInline 而不是 TechInLine .

    如果syncdb没有创建正确的表,可以手动创建。执行此命令:

    python manage.py sqlreset <myapp>
    

    projects_project_techs 桌子将其复制并粘贴到数据库的客户端。

        2
  •  0
  •   Andrew Ingram    16 年前

    假设您的应用程序名为“projects”,techs表的默认名称将为projects\u tech,projects表将为projects\u project。

    多对多表应该类似于projects\u project\u techs

        3
  •  0
  •   swilliams    16 年前

    @约翰·米利金-感谢sqlreset提示,这让我走上了正确的道路。sqlreset生成的代码向我显示 projects_project_techs techs 然后就出现了。

    作为旁注,我必须做一个 admin.site.register(Tech)

    我可能会发布另一个问题,看看是否有更好的方法在不删除数据库的情况下实现模型更改(因为我很确定这就是导致问题的原因)。