English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O modelo é uma classe que representa nossa tabela ou coleção de banco de dados, e cada propriedade dessa classe é um campo da tabela ou coleção. O modelo está no app/definido em models.py (no nosso exemplo é: myapp/models.py)
Abaixo está a criação de uma instância de modelo Dreamreal -
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 from django.db import models class Dreamreal(models.Model): website = models.CharField(max_length = 50) mail = models.CharField(max_length = 50) name = models.CharField(max_length = 50) phonenumber = models.IntegerField() class Meta: db_table = "dreamreal"
Cada modelo herda de django.db.models.Model.
Nossa classe tem4uma propriedade (3 CharField e1um inteiro), isso será o campo na tabela.
A classe Meta e a propriedade db_table nos permitem definir o nome real da tabela ou coleção. O Django nomeia automaticamente a tabela ou coleção: myapp_modelName. Essa classe força o nome da tabela.
No django.db.models, mais tipos de campos, você pode saber mais sobre eles pelo URL:
https://docs.djangoproject.com/en/1.5/ref/models/fields/#field-types
Depois de criar o modelo, é necessário que o Django gere o banco de dados real -
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 $python manage.py syncdb
Vamos criar uma visão 'crudops' para ver como podemos fazer operações CRUD no modelo. Agora no myapp/views.py e em seguida, o que parece com -
myapp/views.py
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 from myapp.models import Dreamreal from django.http import HttpResponse def crudops(request): #Criando uma entrada dreamreal = Dreamreal( website = "www.polo.com", mail = "[email protected]", name = "sorex", phonenumber = "002376970" ) dreamreal.save() #Read ALL entries objects = Dreamreal.objects.all() res = 'Printing all Dreamreal entries in the DB: <br>' for elt in objects: res += elt.name+"<br>" #Read a specific entry: sorex = Dreamreal.objects.get(name = "sorex") res += 'Printing One entry <br>' res += sorex.name #Delete an entry res += '<br> Deleting an entry <br>' sorex.delete() #Update dreamreal = Dreamreal( website = "www.polo.com", mail = "[email protected]", name = "sorex", phonenumber = "002376970" ) dreamreal.save() res += 'Updating entry<br>' dreamreal = Dreamreal.objects.get(name = 'sorex') dreamreal.name = 'thierry' dreamreal.save() return HttpResponse(res)
Vamos explorar outras operações que podemos fazer com o modelo. É importante notar que as operações CRUD são feitas em instâncias do modelo, e agora vamos diretamente representar o funcionamento da classe do modelo.
Vamos criar uma vista "datamanipulation" no myapp/views.py
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 from myapp.models import Dreamreal from django.http import HttpResponse def datamanipulation(request): res = '' #Filtering data: qs = Dreamreal.objects.filter(name = "paul") res += "Found : %s results<br>"%len(qs) #Ordering results qs = Dreamreal.objects.order_by("name") for elt in qs: res += elt.name + '<br>' return HttpResponse(res)
O Django ORM oferece3esta forma para conectar os modelos -
A primeira coisa que veremos aqui é um exemplo de relação um-para-muitos. Como visto no exemplo acima, uma empresa pode ter vários sites online. Essa relação é definida usando django.db.models.ForeignKey -
myapp/models.py
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 from django.db import models class Dreamreal(models.Model): website = models.CharField(max_length = 50) mail = models.CharField(max_length = 50) name = models.CharField(max_length = 50) phonenumber = models.IntegerField() online = models.ForeignKey('Online', default = 1) class Meta: db_table = "dreamreal" class Online(models.Model): domain = models.CharField(max_length = 30) class Meta: db_table = "online"
Pode atualizar o myapp/models.py, como você vê, adicionamos um modelo online e o ligamos ao modelo Dreamreal.
Vamos ver como executar todas as tarefas através do shell manage.py -
Primeiro vamos testar o shell do Django para criar algumas empresas (itens Dreamreal) -
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 $python manage.py shell >>> from myapp.models import Dreamreal, Online >>> dr1 = Dreamreal() >>> dr1.website = 'company1.com' >>> dr1.name = 'company1' >>> dr1.mail = 'contact@company1' >>> dr1.phonenumber = '12345' >>> dr1.save() >>> dr2 = Dreamreal() >>> dr1.website = 'company2.com' >>> dr2.website = 'company2.com' >>> dr2.name = 'company2' >>> dr2.mail = 'contact@company2' >>> dr2.phonenumber = '56789' >>> dr2.save()
Agora há alguns domínios de representação -
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 >>> on1 = Online() >>> on1.company = dr1 >>> on1.domain = "site1.com" >>> on2 = Online() >>> on2.company = dr1 >>> on2.domain = "site2.com" >>> on3 = Online() >>> on3.domain = "site3.com" >>> dr2 = Dreamreal.objects.all()[2] >>> on3.company = dr2 >>> on1.save() >>> on2.save() >>> on3.save()
Acesso às propriedades da empresa hospedada pelo domínio online (item Dreamreal) é simples -
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 >>> on1.company.name
Se quiser saber todos os domínios online hospedados pelo Dreamreal da empresa, usaremos o código -
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 >>> dr1.online_set.all()
Para obter um QuerySet, note que todas as operações que vimos antes (filter, all, exclude, order_by...)
Também pode acessar para operações de filtragem de propriedades de modelo, por exemplo, para obter todos os domínios online em Dreamreal cujo nome contém "company"-
# Nome do arquivo: example.py # Copyright: 2020 Por w3codebox # Autor por: pt.oldtoolbag.com # Data: 2020-08-08 >>> Online.objects.filter(company__name__contains='company'
Nota - Essa consulta suporta apenas bancos de dados SQL. Não funciona em bancos de dados não relacionais, onde não há conexão e existem dois "_".
Mas, isso não é a única maneira de ligar modelos, também há OneToOneField, que garante que o relacionamento entre dois objetos seja um vínculo único. Se usar OneToOneField no exemplo acima, isso significa que há apenas uma entrada online correspondente a cada entrada Dreamreal.
O último, esses relacionamentos ManyToManyField entre tabelas são baseados no banco de dados SQL.