Django:_meta.get_fields():include_parents = False:显示继承自字段的字段

时间:2020-05-16 14:12:16

标签: python django

我有以下模型:

class CommonModel(models.Model):
    """
    Default Common Variables In Database
    """

    class Meta:
        abstract = True

    created_by = models.ForeignKey(User,
                                   related_name="%(app_label)s_%(class)s_created_by",
                                   null=True, blank=True,on_delete=models.SET(get_sentinel_user))
    modified_by = models.ForeignKey(User,
                                    related_name="%(app_label)s_%(class)s_modified_by",
                                    null=True, blank=True,on_delete=models.SET(get_sentinel_user))
    deleted_by = models.ForeignKey(User,
                                   related_name="%(app_label)s_%(class)s_deleted_by",
                                   null=True, blank=True,on_delete=models.SET(get_sentinel_user))
    is_deleted = models.BooleanField(default=False)
    created_date = models.DateTimeField(blank=True)
    deleted_date = models.DateTimeField(null=True, blank=True)
    modified_date = models.DateTimeField(auto_now=True)

class Article(CommonModel):
    title = models.CharField(max_length=256)
    intro_image = models.ImageField(null=True, blank=True, upload_to=doc_hash)
    description = models.TextField(null=True, blank=True)
    url = models.CharField(max_length=256, null=True, blank=True)
    slug = models.SlugField(editable=False)

我正在ipython中尝试以下

> Article._meta.get_fields()

(<django.db.models.fields.AutoField: id>,
 <django.db.models.fields.related.ForeignKey: created_by>,
 <django.db.models.fields.related.ForeignKey: modified_by>,
 <django.db.models.fields.related.ForeignKey: deleted_by>,
 <django.db.models.fields.BooleanField: is_deleted>,
 <django.db.models.fields.DateTimeField: created_date>,
 <django.db.models.fields.DateTimeField: deleted_date>,
 <django.db.models.fields.DateTimeField: modified_date>,
 <django.db.models.fields.CharField: title>,
 <django.db.models.fields.files.ImageField: intro_image>,
 <django.db.models.fields.TextField: description>,
 <django.db.models.fields.CharField: url>,
 <django.db.models.fields.SlugField: slug>

我尝试使用include_parents=False

> Article._meta.get_fields(include_parents=False)

(<django.db.models.fields.AutoField: id>,
 <django.db.models.fields.related.ForeignKey: created_by>,
 <django.db.models.fields.related.ForeignKey: modified_by>,
 <django.db.models.fields.related.ForeignKey: deleted_by>,
 <django.db.models.fields.BooleanField: is_deleted>,
 <django.db.models.fields.DateTimeField: created_date>,
 <django.db.models.fields.DateTimeField: deleted_date>,
 <django.db.models.fields.DateTimeField: modified_date>,
 <django.db.models.fields.CharField: title>,
 <django.db.models.fields.files.ImageField: intro_image>,
 <django.db.models.fields.TextField: description>,
 <django.db.models.fields.CharField: url>,
 <django.db.models.fields.SlugField: slug>

它显示相同的结果。

我认为它不应显示从CommonModel继承的字段

有人可以解释在这种情况下include_parents=False会做什么。

1 个答案:

答案 0 :(得分:0)

As doc says

  • include_parents

    True默认情况下。递归包括在父类上定义的字段。如果设置为False,则get_fields()仅搜索直接在当前模型上声明的字段。直接从抽象模型或代理类继承的模型中的字段被认为是本地的,而不是父级的。

在您的情况下,将CommonModel声明为abstract模型。因此,您在CommonModel中的所有字段都被视为本地字段。我认为您为什么会有相同的结果。