Aula 37 – Loja Online – Django – Breve intro de Foreign Keys
Aula 37 – Loja Online – Django – Foreign Keys tag_set
Voltar para página principal do blog
Todas as aulas desse curso
Aula 36 Aula 38
Se gostarem do conteúdo dêem um joinha 👍 na página do Código Fluente no
Facebook
Esse é o link do código fluente no Pinterest
Meus links de afiliados:
Hostinger
Digital Ocean
One.com
Melhore seu NETWORKING
Participe de comunidades de desenvolvedores:
Fiquem a vontade para me adicionar ao linkedin.
E também para me seguir no GITHUB.
Ah, se puder, clica na estrela nos meus repositórios pra dá uma força ao meu perfil no GITHUB
Código final da aula:
https://github.com/toticavalcanti/django_ecommerce/tree/tags
Intro à Foreign Keys (tag_set)
Na aula passada a gente criou o app tags, cadastramos algumas tags e associamos a alguns produtos.
A relação entre esses dois componentes do nosso projeto é de muitos para muitos, isto é, ManyToMany.
As Foreign Keys servem para associar uma tabela a outra, mas, no caso de relação ManyToMany, temos uma tabela intermediária, para fazer a associação correta.
A relação é ManyToMany, porque um produto pode estar associado a várias Tags diferentes, assim como uma Tag pode estar associada a muitos produtos diferentes.
Veja na figura abaixo, um exemplo, onde temos a relação muito para muitos entre Order e Product.
Prática
Deixe um shell aberto com o servidor rodando.
Para isso, ative o ambiente virtual como explicado em aulas anteriores, entre na pasta src e digite:
python manage.py runserver
Agora abra outro terminal, ative seu ambiente virtual nele também, entre na pasta onde fica o manage.py, isto é, a pasta src e digite:
python manage.py shell
O prompt vai ficar assim:
>>>
Agora podemos digitar alguns comandos e tentar entender um pouco mais a relação ManyToMany entre Product e Tag.
Comandos usados nessa aula:
'''
# Shell session 1
# python manage.py shell
'''
from tags.models import Tag
qs = Tag.objects.all()
print(qs)
white = Tag.objects.last()
white.title
white.slug
white.active
# A saída é um gerenciador de muitos para muitos#
# many to many manager
white.products
"""
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager..ManyRelatedManager object at 0x7fa2e27707f0>
"""
white.products.all()
"""
Queryset de PRODUCTS, muito parecido com Products.objects.all (),
mas, neste caso, são TODOS os produtos que estão relacionados à tag "White"
"""
white.products.all().first()
"""
returna a primeira instância, se tiver
"""
exit()
'''
# Shell session 2
# python manage.py shell
'''
from products.models import Product
qs = Product.objects.all()
qs
tshirt = qs.first()
tshirt
tshirt.title
tshirt.description
tshirt.tag
"""
Lança um error porque o Product model não tem o campo "tag"
"""
tshirt.tags
"""
Lança um error porque o Product model não tem o campo "tags"
"""
tshirt.tag_set
"""
Isso funciona porque o modelo de Tag tem o campo "products" com o ManyToMany para o Product
<django.db.models.fields.related_descriptors.create_forward_many_to_many_manager..ManyRelatedManager object at 0x7fd2e9879f98>
"""
tshirt.tag_set.all()
"""
Retorna um Queryset do modelo Tag, relacionado a este produto
"""
tshirt.tag_set.filter(title__iexact='azul')