Django: _meta.get_fields() : include_parents=False : Shows fields derived from inheritance

Viewed 293

I have the following model:

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)

I am trying the following in 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>

I try with 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>

It shows the same results.

I think it should not show the fields inherited from the CommonModel

Can some explain what does include_parents=False in this case will do.

1 Answers

As doc says

  • include_parents:

    True by default. Recursively includes fields defined on parent classes. If set to False, get_fields() will only search for fields declared directly on the current model. Fields from models that directly inherit from abstract models or proxy classes are considered to be local, not on the parent.

In your case, the CommonModel declared as abstract model. So, all your fields in the CommonModel considered as local fields. I think that why you have the same results.

Related