2017-04-20 60 views
0

我使用Django 1.10。我有以下的模型结构:Admin和Meta没有看到父抽象类的字段

class GenericPage(models.Model): 
    """Abstract page, other pages inherit from it.""" 
    book = models.ForeignKey('Book', on_delete=models.CASCADE) 

    class Meta: 
     abstract = True 

class GenericColorPage(models.Model): 
    """Abstract page that is sketchable and colorable, other pages inherit from it.""" 
    sketched = models.BooleanField(default=False) 
    colored = models.BooleanField(default=False) 

    class Meta: 
     abstract = True 

class GenericBookPage(GenericColorPage): 
    """A normal book page, with a number. Needs to be storyboarded and edited.""" 

    ### 
    #various additional fields 
    ### 

    class Meta: 
     # unique_together = (('page_number', 'book'),) # impedes movement of pages 
     ordering = ('-book', '-page_number',) 
     abstract = True 

    objects = BookPageManager() # the manager for book pages 

class BookPage(GenericBookPage): 
    """Just a regular book page with text (that needs to be proofread)""" 
    proofread = models.BooleanField(default=False) 

另外,从管理的摘录:

class BookPageAdmin(admin.ModelAdmin): 
    # fields NOT to show in Edit Page. 
    list_display = ('__str__', 'page_name', 'sketched', 'colored', 'edited', 'proofread',) 
    list_filter = ('book',) 
    readonly_fields = ('page_number',) # valid page number is assigned via overridden save() in model 
    actions = ['delete_selected',] 

我试图做./manage.py makemigrations,但如果将引发以下错误:

<class 'progress.admin.BookPageAdmin'>: (admin.E116) The value of 'list_filter[0]' refers to 'book', which does not refer to a Field. 
progress.BookPage: (models.E015) 'ordering' refers to the non-existent field 'book'. 

在过去,当我没有使用摘要,只是把所有东西都放到BookPage模型中时,它一切正常。但似乎Meta和Admin没有看到父类中的字段。我错过了什么吗?有没有办法让他们阅读抽象父母的领域?

回答

2

在过去,当我没有使用摘要,只是把一切都变成BookPage模式,它都能正常运作

当然它工作得很好,因为你把里面的东西BookPage这不是abstract class这意味着将创建表(以及字段)。

但似乎元和管理员看不到父类中的字段。我错过了什么吗?

您错过了您的模型没有从GenericPage抽象模型继承的事实。因此,book字段永远不会被创建。

有没有办法让他们阅读抽象的父母领域?

您必须创建/修改从抽象模型继承的模型。也许,这样做:

class GenericBookPage(GenericColorPage, GenericPage): 

,它允许你同时继承GenericColorPageGenericPage领域。当我说继承时,我的意思是当migrate命令运行时实际创建数据库表和相关列(模型字段)。

+0

哦,男孩,我在那里犯了一个错误。它应该是'GenericColorPage(GenericPage):'而不是!我几乎认为Django无法遍历摘要树,但首先没有树。感谢您指出! – Highstaker