Pular para conteúdo

Modelos da Banco de Dados

Criando Modelos (Models)

Se o seu plugin for introduzir um novo tipo de objet ono NetBox, você provável vai querer criar um modelo Django para isso. Um modelo é essencialmente a representação de uma tabela do banco de dados, com atributos que representam colunas individuais. Instâncias do modelo (objetos) podem ser criados, manipulados e deletados utilizando queries. Modelos devem ser definidos dentro do arquivo chamado de models.py.

Abaxo está um exemplo do arquivo models.py contendo o modelo com dois campos de texto (caracteres):

from django.db import models

class MyModel(models.Model):
    foo = models.CharField(max_length=50)
    bar = models.CharField(max_length=50)

    def __str__(self):
        return f'{self.foo} {self.bar}'

Todo modelo inclui por padrão uma chave primária numérica (primary key). Esse valor é gerado automaticamente pelo banco de dados, e pode ser referenciado como pk ou id.

Habilitando as Funções do NetBox

Os podemos do plugin podem fazer utilizar certas características e funções do NetBox ao herdar a classe NetBoxModel do NetBox. Essa classe extende o modelo do plugin para habilitar essas características únicas ao NetBox, incluindo:

  • Registro de Log (Change Logging)
  • Campos Customizados
  • Links Customizados
  • Validação Customizada
  • Exportação de Templates
  • Journaling
  • Tags
  • Webhooks

Essa classe performa duas funções cruciais:

  1. Aplica qualquer campo, método e/ou atributos necessários para a operação destas funções e características.
  2. Registra o modelo no NetBox para utilizar essas funções e características.

Simplesmente crie uma subclasse do NetBoxModel quando for definir um modelo dentro do seu plugin:

# models.py
from django.db import models
from netbox.models import NetBoxModel

class MyModel(NetBoxModel):
    foo = models.CharField()
    ...

Propriedades do NetBoxModel

docs_url

Esse atributo especifica a URL pela a qual a documentação deste modelo pode ser alcançada. Por padrão, ela retornará /static/docs/models/<app_label>/<model_name>/. Modelos de Plugin podem sobrepor isso com uma URL customizada. Por exemplo, você pode querer direcionar o usuário para a sua própria documentação hospedada em ReadTheDocs.

Habilitando as Funções e Características Individualmente

Se você preferir, ao invés, habilitar somente um subgrupo dessas características do modelo do plugim o NetBox fornece uma classe "mix-in" para cada característica. Você pode criar uma subclasse de cada uma individualmente ao definir um modelo. (Seu modelo também precisará herdar a classe nativa do Django Model.)

Por exemplo, se você quiser suportar somente tags e templates de exportação, nós herdamos as classes ExportTemplateMixin e TagsMixin, e classe Model do Django. (Herdar todas os mixins é mesma coisa que criar uma subclasse de NetBoxModel.)

# models.py
from django.db import models
from netbox.models.features import ExportTemplatesMixin, TagsMixin

class MyModel(ExportTemplatesMixin, TagsMixin, models.Model):
    foo = models.CharField()
    ...

Migrações do Banco de Dados

Uma vez que você tenha completado de definir os modelos do seu plugin, você precisará criar um esquema de migração do banco de dados. Um arquivo de migração é essencialmente um grupo de instruções para manipular o banco de dados do PostgreSQL para suportar seu novo modelo, ou altera um modelo existente. Criar migrações podem normalmente serem feitas automaticamente pelo comando de gerência makemigrations do Django. (Certifique-se de seu plugin foi instalado e habilite-o, de outra forma, não será encontrado.)

Note

O NetBox força uma medidade segurança sobre o comando makemigrations para proteger que os usuários regulares (normais) criem um esquema de migração errado. Para habilitar esse comando no desenvolvimento de plugins, configure DEVELOPER=True no arquivo do NetBox configuration.py.

$ ./manage.py makemigrations my_plugin 
Migrations for 'my_plugin':
  /home/jstretch/animal_sounds/my_plugin/migrations/0001_initial.py
    - Create model MyModel

Agora, nós podemos aplicação a mgiração do banco de dados com o comando migrate:

$ ./manage.py migrate my_plugin
Operations to perform:
  Apply all migrations: my_plugin
Running migrations:
  Applying my_plugin.0001_initial... OK

Para mais informações sobre a migração do banco de dados, veja a documentação do Django.

Referência das Funções dos Mixins

Warning

Note que somente a classe que aparece na documentação que é suportada. Embora outras classes possam estar presentes dentro do módulo features, eles não são suportados para uso dos plugins.

::: netbox.models.features.ChangeLoggingMixin

::: netbox.models.features.CloningMixin

::: netbox.models.features.CustomLinksMixin

::: netbox.models.features.CustomFieldsMixin

::: netbox.models.features.CustomValidationMixin

::: netbox.models.features.ExportTemplatesMixin

::: netbox.models.features.JournalingMixin

::: netbox.models.features.TagsMixin

::: netbox.models.features.WebhooksMixin

Grupos de Escolha (Choice Sets)

Para que cada campo do modelo de seção suporte um ou mais valores com uma lista de escolhas pré-definidas, NetBox fornece a classe de utilidades ChoiceSet. Pode ser usado no lugar de um tuple de escolhas regular para fornecer funcionalidades melhoradas, como configuração dinâmica e coloração. (Veja a documentação do Django sobre o parâmetro choices para os campos de modelo suportados.)

To define choices for a model field, subclass ChoiceSet and define a tuple named CHOICES, of which each member is a two- or three-element tuple. These elements are: Para definir as escolhas de um campo do modelo, crie uma subclasse de ChoiceSet e defina uma tuple com o nome de CHOICES, na qual cada membro é uma tupla de dois ou três elementos. Esses elementos são:

  • O valor do banco de dados
  • Uma tag (label) correspondente para ser lida por humanos
  • Uma cor associada (opcional)

Um exemplo completo é fornecido abaixo.

Note

Autores podem achar útil declarar cada um dos valores do banco de dados como uma constante dentro da classe e referenciá-las dentro dos membros de CHOICES. Essa convenção permite que os valores sejam referenciados fora da classe, no entanto não é estritamente obrigatório.

Configuração Dinâmica

Algumas escolhas de campos do mudelo podem ser configurados pelo administrador. Por exemplo, os valores padrões do campo do modelo do Site status pode ser substituído ou suplementado com escolhas customizadas. Para habilitar a configuração dinâmica para a subclasse de um ChoiceSet, defina a key como um texto (string) especificando o modelo e o nome do campo ao qual se aplica. Por exemplo:

from utilities.choices import ChoiceSet

class StatusChoices(ChoiceSet):
    key = 'MyModel.status'

Para extender ou substituir os valores padrões para o grupo de escolhas, o administrador do NetBox pode referenciá-lo no parâmetro de configuração em FIELD_CHOICES. Por exemplo, o campo de status no MyModel dentro de my_plugin iria ser referenciado como:

FIELD_CHOICES = {
    'my_plugin.MyModel.status': (
        # Escolhas customizadas
    )
}

Exemplo

# choices.py
from utilities.choices import ChoiceSet

class StatusChoices(ChoiceSet):
    key = 'MyModel.status'

    STATUS_FOO = 'foo'
    STATUS_BAR = 'bar'
    STATUS_BAZ = 'baz'

    CHOICES = [
        (STATUS_FOO, 'Foo', 'red'),
        (STATUS_BAR, 'Bar', 'green'),
        (STATUS_BAZ, 'Baz', 'blue'),
    ]

Warning

Para configuração dinâmica funcionar corretamente, CHOICES devem ser uma lista mutáveis, no lugar de uma tuple.

# models.py
from django.db import models
from .choices import StatusChoices

class MyModel(models.Model):
    status = models.CharField(
        max_length=50,
        choices=StatusChoices,
        default=StatusChoices.STATUS_FOO
    )