在django应用中,我有一个HouseHold
模型,children
模型的Child
ManytoMany外键。
在管理员中,我在内联中显示关联的Child
个实例,紧随django docs on the subject之后:
class FamilyInline(admin.TabularInline):
model = HouseHold.children.through
class HouseHoldAdmin(admin.ModelAdmin):
inlines = [ FamilyInline, ]
exclude = ('children',)
我运作良好,但显示了一个HTML选择小部件,其中包含来自每个家庭的所有孩子(非常长:8000多个项目)
我尝试将此表单添加到FamilyInline:
class ChildForm(forms.ModelForm):
class Meta:
model = Child
fields = ('name','school')
class FamilyInline(admin.TabularInline):
form = ChildForm
model = HouseHold.children.through
但这会引发错误:
FieldError at /admin/myapp/household/820126/
Unknown field(s) (name, school) specified for HouseHold_children
我只想为每个孩子编辑一些字段(名字,姓氏,学校......)而不是这个选择小部件。有可能吗?
更新:A solution for a very similar question here不适用,错误说Child与HouseHold没有关系(这有点真实,但它有反向的)
答案 0 :(得分:1)
这是基本 M2M功能。内联工作取决于内联对象与正在编辑的父对象直接相关的原理。多对多关系不符合条件,因为子级与父级没有直接关系,而是与本身与父级相关的中间表相关。这就是为什么你可以使用Household.children.through
而不只是Child
。实际上Household.children.through
和Household
之间存在关联,但Child
和Household
之间不存在关联。
但是,出于您的目的,您可以通过简单地设计模型来实现您想要的目标。家庭和儿童不是M2M关系。一个家庭有很多孩子,但一个孩子只有一个家庭。这意味着家庭应该是孩子的外国关键词,然后你就可以轻松地内联Child
。