【问题标题】:Displaying foreign key related tables in Django Admin在 Django Admin 中显示外键相关表
【发布时间】:2019-01-21 10:25:24
【问题描述】:

我正在尝试创建属性列表并将其链接到对象。

表格:属性

class Properties(models.Model):
    Property = models.CharField(primary_key=True, max_length=4......
    PropetyDesc = models.CharField(max_length= .......

桌子:木头

class Wood(models.Model):
    Name = models.CharField(max_length= .....
    Property = models.ForeignKey(Properties, on_delete=models......

一开始,我尝试使用 Django Admin 的功能来了解 DB 设计是如何叠加的。

简而言之,我的管理页面看起来像一个用于创建采购订单的 GUI,其中标题部分将包含订单详细信息,在项目行中我们将包含材料:

在本例中,我试图将对象(木头)放在标题上,并且在创建的“TabularInline”中可以选择属性。

class PropertiesInline(admin.TabularInline):
    model = Properties

    def get_extra(self, request, obj=None, **kwargs):
        extra = 1
        return extra

class WoodAdmin(admin.ModelAdmin):
    list_display = ('Name', 'Property')
    fields = ['Name', 'Property'] 
    inlines = [PropertiesInline] 

admin.site.register(Wood, WoodAdmin)

但是,我最终得到以下错误:

ERRORS:
<class 'mapp.admin.PropertiesInline'>: (admin.E202) 'mapp.Properties' has no ForeignKey to 'mapp.Wood'.

另一方面,如果我要像这样反转场景:

class WoodInline(admin.TabularInline):
    model = Wood

    def get_extra(self, request, obj=None, **kwargs):
        extra = 1
        return extra

class PropertiesAdmin(admin.ModelAdmin):
    list_display = ('Property', 'PropetryDesc')
    fields = ['Property', 'PropertyDesc'] 
    inlines = [WoodInline] 

admin.site.register(Properties, PropertiesAdmin)

页面加载,但我最终在标题中获得了“Property”,并带有选择“Wood”的各种记录的选项。

有什么方法可以实现我想要的。

【问题讨论】:

  • 这应该暗示你的模型定义是错误的。 ForeignKey 应该在关系的“多”端;在这里,它应该在 Property 上,指向 Wood。
  • 正是如此。但我的理解是,一个实体可以有许多属性(属性,如果可以的话),但可能不是相反。所以就我而言,我反对在“属性”中定义一个指向“Wood”表的 FK 字段。那么......有没有办法解决我的困境?
  • 我不明白你的反对意见。让 Wood 拥有许多 Properties 的方法是让 Property 上的 FK 指向 Wood。你现在拥有它的方式允许一个属性拥有许多伍兹,这正是你说你不想要的。
  • 除非你读了你不会理解的问题。看看这个比喻。
  • 我确实读过这个问题。第三次,你的 fk 是你想要的,交换它会做你想要的。

标签: django django-models django-forms foreign-keys


【解决方案1】:

通过创建一个与两个表都有 FK 关系的中间表来解决这个难题。使用属性创建了一个表格内联,并使用分配为内联对象的属性注册了 Wood。这样,我现在可以将许多属性附加到对象(木材)。

【讨论】:

    猜你喜欢
    • 2012-07-05
    • 2021-02-07
    • 2016-11-12
    • 1970-01-01
    • 2013-02-26
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多