NovadataModel

Classe para facilitar a criação de uma model, implmentando algumas funcionalidades úteis e também definindo alguns atributos geralmente usados.

Código da classe:

from django.conf import settings
from django.db import models


class NovadataModel(models.Model):
    data_criacao = models.DateTimeField(
        verbose_name="Data de criação",
        auto_now_add=True,
    )

    data_atualizacao = models.DateTimeField(
        verbose_name="Data de atualização",
        auto_now=True,
    )

    usuario_criacao = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        verbose_name="Usuário de criação",
        blank=True,
        null=True,
    )

    usuario_atualizacao = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name="%(class)s_requests_modified",
        verbose_name="Usuário de atualização",
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

    def save(self, *args, **kwargs):
        """Sobrescrita do método save para realizarmos ações personalizadas."""
        from crum import get_current_user

        user = get_current_user()
        if user and not user.pk:
            user = None
        if not self.pk:
            self.usuario_criacao = user
        self.usuario_atualizacao = user

        super(NovadataModel, self).save(*args, **kwargs)

Exemplo de uso:

from django.db import models
from novadata_utils.models import NovadataModel


class Exemplo(NovadataModel):
    nome = models.CharField(
        verbose_name="Nome",
        max_length=100,
    )

    # Restante dos atributos

    def __str__(self):
        """Método que retorna a representação do objeto como string."""
        return self.nome

    class Meta:
        """Sub classe para definir meta atributos da classe principal."""

        app_label = "core"
        verbose_name = "Exemplo"
        verbose_name_plural = "Exemplos"

Com isso você conseguirá automaticamente ter os campos de data de criação e atualização, além de usuário de criação e atualização, que serão preenchidos automaticamente.

Aviso

Usar a classe NovadataModel gera uma herança, ou seja, a sua classe Exemplo herda de NovadataModel, ficando vinculada a ela, isso nem sempre é o desejado, por isso, você pode herdar da AbstractNovadataModel, que não gera uma herança, mas sim uma cópia dos atributos, veja mais sobre ela na próxima página.