【发布时间】: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