0

我要模型

class Parent(object):
     text_field = models.TextField()  
     boolean_field = models.BooleanField()

class Child(Parent):
     another_text_field = models.TextField()

使用以下 ModelAdmin

class ChildAdmin(admin.ModelAdmin):                         
    pass 


admin.site.register(Child, ChildAdmin)       

我目前在管理页面中看到所有字段,即 text_field、boolean_field 和 another_text_field。

问题:如何获得父选择字段并排除 text_field 和 boolean_field (我想我可以使用后者exclude)。

当前解决方案:我添加了一个表单并使用它的clean方法来设置父字段。text_field并且boolean_field可以通过将其添加到 ModelAdmin 的excluded变量中来排除。

4

2 回答 2

0

只需覆盖字段

class Child(Parent):
    another_text_field = models.TextField()
    text_field = None
    boolean_field = None

如果你想在 django 模型中使用继承,请使用抽象模型。

于 2019-05-10T09:48:36.100 回答
0

我不确定是否真的有必要使用模型继承。如果没有,您可以考虑OneToOneField不使用模型继承。

使用示例OneToOneField

模型.py

class Parent(models.Model):
    text_field = models.TextField()  
    boolean_field = models.BooleanField()

class Child(models.Model):
    parent = models.OneToOneField(Parent,
        on_delete=models.CASCADE,
        primary_key=True)
    child_field = models.TextField()

管理员.py

@admin.register(Parent)
class ParentAdmin(admin.ModelAdmin):
    pass

Parent这样做您可以在子管理页面上看到一个用于选择实例的下拉菜单。但与此同时,您失去了使用继承的一个“好处”,即Parent字段的可用性Child

文档中所述,

Place 的所有字段也将在 Restaurant 中可用,尽管数据将驻留在不同的数据库表中。

但有一个简单的解决方法,只需使用类似Child.objects.filter(parent__text_field="something"). 查询性能应该是相同的(我猜),因为这两种方法在 db 中的实现基本相同(都使用分隔表)(如果我错了请更正)

除了这个和管理员显示行为之外,我不确定这两种方法(你的方法和这个答案)有什么不同。

于 2021-04-24T16:11:45.380 回答