💻
Dicas de Django
  • Dica 1 - Django boilerplate e cookiecutter-django
  • Dica 1.1 - Django boilerplate
  • Dica 2 - Django extensions
  • Dica 3 - Django bulk_create e django-autoslug
  • Dica 4 - Django Admin personalizado
  • Dica 5 - Django Admin Date Range filter
  • Dica 6 - Geradores de senhas randômicas - uuid, hashids, secrets
  • Dica 7 - Rodando o ORM do Django no Jupyter Notebook
  • Dica 8 - Conhecendo o Django Debug Toolbar
  • Dica 9 - Escondendo suas senhas python-decouple
  • Dica 10 - Prototipagem de web design (Mockup)
  • Dica 11 - Bootstrap e Bulma + Colorlib
  • Dica 12 - Imagens: pexels e unsplash
  • Dica 13 - Cores
  • Dica 14 - Herança de Templates e Arquivos estáticos
  • Dica 15 - Busca por data no frontend
  • Dica 16 - Filtros com django-filter
  • Dica 17 - Criando comandos personalizados
  • Dica 18 - bulk_create e bulk_update
  • Dica 19 - Criando Issues por linha de comando com a api do github
  • Dica 20 - api github e click
  • Dica 21 - Criando issues por linha de comando com gitlab cli
  • 022-criando-issues-por-linha-de-comando-com-bitbucket-cli
  • Dica 23 - Diferença entre JSON dump, dumps, load e loads
  • Dica 24 - Barra de progresso
  • Dica 25 - Rodando Shell script dentro do Python
  • Dica 26 - Rodando Python dentro do Shell script
  • Dica 27 - Retornando os nomes dos campos do model
  • Dica 28 - Admin: Usando short description
  • Dica 29 - Django Admin: Criando actions no Admin
  • Dica 30 - Django Admin: Editando direto na listview do Admin
  • Dica 31 - Django Admin: Pegando usuário logado no Admin
  • Dica 32 - Django Admin: Sobreescrevendo os templates do Admin
  • Dica 33 - Github cli
  • Dica 34 - Django: custom template tags
  • Dica 35 - Django: passando usuário logado no formulário
  • Dica 36 - Django: visualizando seus modelos com graph models
  • Dica 37 - Faker
  • Dica 38 - Django: Paginação + Filtros
  • Dica 39 - Django Admin: display decorator (Django 3.2+)
  • Dica 40 - Formulários: date, datetime, duration e templatetags de data
  • Dica 41 - django-seed
  • Dica 42 - Custom context processors
  • Dica 43 - django-admin-rangefilter
  • Dica 44 - Django: F() expression
  • Dica 45 - DRF: Scaffold django apis - Django REST framework
  • Dica 46 - DRF: drf-yasg - Yet another Swagger generator
  • Dica 47 - DRF: djoser - Django REST framework
  • Dica 48 - DRF: Reset de Senha com djoser - Django REST framework
  • Dica 49 - DRF: Autenticação via JWT com djoser - Django REST framework
  • Dica 50 - DRF: Django CORS headers
  • Dica 51 - DRF: paginação
  • Dica 52 - DRF: django-filter
  • Dica 53 - DRF: Criando subrota com action
  • 54-django-extensions-mais-comandos
  • Dica 55 - Rodando Django em https localmente com runserver_plus
  • Dica 56 - Django inlineformset_factory + HTMX
  • Dica 57 - Criando API com Django SEM DRF
  • Dica 58 - Rodando PostgreSQL com Docker + Portainer + pgAdmin + Django local para desenvolvimento
  • Dica 59 - Django: Busca por palavras acentuadas ou sem acento
  • Dica 60 - Django: Adicionando atributos extras no formulário
  • Dica 01 - Criando Issues com API do Github (Linux)
  • Dica 02 - Usando http.server
  • Dica 03 - Criando um template com Bulma CSS
  • Dica 04 - Criando um template com Tailwind CSS
  • Dica 05 - htmx simples
  • Dica 06 - Criando o projeto Django
  • Dica 07 - PostgreSQL, pgAdmin e MailHog com docker-compose
  • Dica 08 - Aplicando isort e autopep8
  • Dica 09 - Aplicando djhtml
  • Dica 10 - Criando Makefile
  • Dica 11 - Criando Landpage de produtos
  • 072-012-fale-co-nosco-form-email
  • Dica 13 - Dashboard com Django e Tailwind CSS
  • Dica 14 - Django Custom User com e-mail
  • Dica 15 - Login com e-mail no Django
  • Dica 16 - Logout
  • Dica 17 - Cadastro de Usuários no Django
  • Dica 18 - Esqueci a senha
  • Dica 19.1 - Modelagem - OneToMany - Um pra Muitos - ForeignKey - Chave Estrangeira
  • Dica 19.2 - Modelagem - OneToOne - Um pra Um
  • Dica 19.3 - Modelagem - ManyToMany - Muitos pra Muitos
  • Dica 19.4 - Modelagem - Abstract Inheritance - Herança Abstrata
  • Dica 19.5 - Modelagem - Multi-table Inheritance - Herança Multi-tabela
  • Dica 19.6 - Modelagem - Proxy Model
  • Dica 19.7 - Modelagem - Resumo
  • Dica 20 - Templates
  • Dica 21 - Tentativas de Login
  • Dica 22 - Validação
  • Dica 23 - CRUD de produtos
  • Dica 24 - Alpine.js e Django
  • 091-25-dica-queryset
  • Dica 26 - Paginação e Breadcrumb
  • Dica 27 - Signals
  • Dica 28 - Gerando dados aleatórios com Faker - faker-commerce
  • Dica 29 - Importando CSV
  • 096-30-import-csv-inmemoryuploadedfile
  • Dica 31 - Importando CSV com Pandas
  • Dica 32 - Importando CSV com Dask
  • Dica 33 - Importando XLSX com OpenPyXL
  • 100-34-export-csv
  • Dica 35 - Exportando XLSX mais rápido com pyexcelerate
  • Dica 36 - Exportando CSV e XLSX pelo front no projeto
  • Novidades do Django 5.1
  • Django Router
  • 105-django-52
Powered by GitBook
On this page
  • Jupyter Notebook
  • Exemplo
  • Exemplo
  • Jupyter Notebook
  • Exemplo
  • Jupyter Notebook

Was this helpful?

Dica 19.3 - Modelagem - ManyToMany - Muitos pra Muitos

PreviousDica 19.2 - Modelagem - OneToOne - Um pra UmNextDica 19.4 - Modelagem - Abstract Inheritance - Herança Abstrata

Last updated 2 years ago

Was this helpful?

# bookstore/models.py
class Author(models.Model):
    first_name = models.CharField('nome', max_length=100)
    last_name = models.CharField('sobrenome', max_length=255, null=True, blank=True)  # noqa E501

    class Meta:
        ordering = ('first_name',)
        verbose_name = 'autor'
        verbose_name_plural = 'autores'

    @property
    def full_name(self):
        return f'{self.first_name} {self.last_name or ""}'.strip()

    def __str__(self):
        return self.full_name


class Book(models.Model):
    isbn = models.CharField(max_length=13, unique=True)
    title = models.CharField('título', max_length=255)
    rating = models.DecimalField('pontuação', max_digits=5, decimal_places=2, default=5)
    authors = models.ManyToManyField(
        Author,
        verbose_name='autores',
        blank=True
    )
    price = models.DecimalField('preço', max_digits=5, decimal_places=2)
    stock_min = models.PositiveSmallIntegerField(default=0)
    stock = models.PositiveSmallIntegerField(default=0)
    created = models.DateTimeField(
        'criado em',
        auto_now_add=True,
        auto_now=False
    )
    modified = models.DateTimeField(
        'modificado em',
        auto_now_add=False,
        auto_now=True
    )

    class Meta:
        ordering = ('title',)
        verbose_name = 'livro'
        verbose_name_plural = 'livros'

    def __str__(self):
        return f'{self.title}'
# bookstore/admin.py
from .models import Author, Book


@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('__str__',)
    search_fields = ('first_name', 'last_name')


@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = (
        'isbn',
        '__str__',
        'rating',
        'price',
        'stock_min',
        'stock',
    )
    list_display_links = ('__str__',)
    search_fields = ('isbn', 'title')
python manage.py makemigrations
python manage.py migrate

Jupyter Notebook

# Criando os autores
daniel = Author.objects.create(first_name='Daniel', last_name='Greenfeld')
audrey = Author.objects.create(first_name='Audrey', last_name='Greenfeld')

# Criando o livro
book = Book.objects.create(
    title='Two Scoops of Django',
    isbn='9780981467344',
    price=44.95
)

# Associando os autores ao livro
book.authors.add(daniel)
book.authors.add(audrey)

# Retornando os autores do livro
book.authors.all()

# Buscando por todos os livros do autor informado
Book.objects.filter(authors__last_name='Greenfeld').distinct()

# Buscando pelo autor cujo livro se chama 'Two Scoops of Django'
Author.objects.filter(book__title='Two Scoops of Django')

Exemplo

# bookstore/models.py
class Store(models.Model):
    name = models.CharField('nome', max_length=255)
    books = models.ManyToManyField(
        Book,
        verbose_name='livros',
        blank=True
    )

    class Meta:
        ordering = ('name',)
        verbose_name = 'loja'
        verbose_name_plural = 'lojas'

    def __str__(self):
        return f'{self.name}'
# bookstore/admin.py
from .models import Store

@admin.register(Store)
class StoreAdmin(admin.ModelAdmin):
    list_display = ('__str__',)
    search_fields = ('name',)
python manage.py makemigrations
python manage.py migrate

Exemplo

# bookstore/models.py
class Book(models.Model):
    ...
    publisher = models.ForeignKey(
        'Publisher',
        on_delete=models.SET_NULL,
        verbose_name='editora',
        related_name='books',
        null=True,
        blank=True
    )

class Publisher(models.Model):
    name = models.CharField('nome', max_length=255)

    class Meta:
        ordering = ('name',)
        verbose_name = 'editora'
        verbose_name_plural = 'editoras'

    def __str__(self):
        return f'{self.name}'
# bookstore/admin.py
from .models import Publisher


@admin.register(Publisher)
class PublisherAdmin(admin.ModelAdmin):
    list_display = ('__str__',)
    search_fields = ('name',)

Adicione publisher no list_display de BookAdmin.

python manage.py makemigrations
python manage.py migrate

Jupyter Notebook

book = Book.objects.filter(title__icontains='two scoops').first()
publisher = Publisher.objects.create(name='Feldroy')

book.publisher = publisher
book.save()

# Conferindo
book.publisher

Exemplo

Jupyter Notebook

# Cria grupos
grupos = ['gerente', 'vendedor', 'comprador', 'entregador']

[Group.objects.create(name=grupo) for grupo in grupos]

Group.objects.count()
Group.objects.all()

# Cria usuário
gerson = User.objects.create(email='gerson@email.com', first_name='Gerson')

# Associa usuário a um grupo
vendedor = Group.objects.get(name='vendedor')
gerson.groups.add(vendedor)

# Retorna os grupos do usuário
gerson.groups.all()

# Cria usuário
jeremias = User.objects.create(email='jeremias@email.com', first_name='Jeremias')

# Associa usuário a um grupo
jeremias.groups.add(vendedor)

# Retorna todos os usuários do grupo 'vendedor'
User.objects.filter(groups__name='vendedor')