python.django.correctness.model-save.django-db-model-save-super

profile photo of semgrepsemgrep
Author
7,380
Download Count*

Detected a django model $MODEL is not calling super().save() inside of the save method.

Run Locally

Run in CI

Defintion

rules:
  - id: django-db-model-save-super
    patterns:
      - pattern-inside: |
          class $MODEL(django.db.models.Model):
              ...
      - pattern-not: |
          def save(self, ...):
            ...
            super($MODEL, self).save(...)
      - pattern-not: |
          def save(self, ...):
            ...
            super().save(...)
      - pattern: |
          def save(self, ...):
            ...
    message: Detected a django model `$MODEL` is not calling super().save() inside
      of the save method.
    languages:
      - python
    severity: WARNING
    metadata:
      category: correctness
      technology:
        - django
      license: Commons Clause License Condition v1.0[LGPL-2.1-only]

Examples

model-save.py

from django.db import models
from django.template.defaultfilters import slugify

class Post(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, max_length=255)

    # ok: django-db-model-save-super
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super(Post, self).save(*args, **kwargs)

class Bad(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True, max_length=255)

    # ruleid: django-db-model-save-super
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)

class ModelIssue1106(models.Model):

    # ok: django-db-model-save-super
    def save(self, *args, **kwargs):
        print("my overriden save method")
        super().save(*args, **kwargs)


class ModelIssue1106_2(models.Model):

    # ok: django-db-model-save-super
    def save(self, *args, **kwargs):
        print("my overriden save method")
        super(ModelIssue1106_2, self).save(*args, **kwargs)