class Livro(models.Model):
titulo = models.CharField(max_length=256)
isbn = models.CharField(max_length=16, blank=True)
edicao = models.CharField(max_length=64, blank=True)
qt_paginas = models.PositiveIntegerField(default=0)
dt_catalogacao = models.DateField(auto_now_add=True)
editora = models.ForeignKey('Editora')
categoria = models.CharField(max_length=8, blank=True,
choices=CATEGORIAS)
class Meta:
ordering = ('titulo', 'isbn', 'id')
def __unicode__(self):
return self.titulo
Os seguintes métodos, se definidos em um modelo, são utilizados pelo Django em vários contextos:
campos que emulam tipos básicos de SQL
- CharField, TextField, BooleanField, NullBooleanField
- DateField, DateTimeField, TimeField
- IntegerField, SmallIntegerField, AutoField
- DecimalField, FloatField
campos que acrescentam validações sobre tipos básicos
- EmailField, URLField, IPAddressField, SlugField, XMLField
- PositiveIntegerField, PositiveSmallIntegerField, CommaSeparatedIntegerField
campos para armazenar arquivos
- FileField, FilePathField, ImageField
- nos três casos, os dados são armazenados no sistema de arquivos, e o campo no banco de dados registra apenas o nome do arquivo ou o caminho
fonte: django/db/models/fields/__init__.py:
class Field(object):
'...'
def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='',
db_column=None, db_tablespace=None, auto_created=False):
'...'
parâmetros que definem o esquema no banco de dados:
- primary_key, unique, null, db_index, db_column, db_tablespace
parâmetros que definem a validação e a apresentação do campo para o usuário:
- verbose_name, blank, default, unique_for_date, unique_for_month, unique_for_year, choices, help_text
Em ordem de utilidade (subjetiva).
Em ordem de utilidade (subjetiva).
Em ordem de utilidade (subjetiva).
BEBIDAS = (('cafe',u'Café expresso'), ('mate',u'Chá mate'), ('chocolate',u'Chocolate quente'))
class Pedido(models.Model):
bebida = models.CharField(max_length=16, choices=BEBIDAS)
<select name="bebidas">
<option value="cafe">Café expresso</option>
<option value="mate">Chá mate</option>
<option value="chocolate">Chocolate quente</option>
</select>
ForeignKey: referência a objeto (chave estrangeira)
relação muitos-para-um:
class Livro(models.Model): titulo = models.CharField(max_length=256) editora = models.ForeignKey('Editora') class Editora(models.Model): nome = models.CharField(max_length=128) cidade = models.CharField(max_length=128)objeto referente (editora) ganha um atributo dinâmico «modelo»_set onde «modelo» é o nome do modelo relacionado em caixa baixa (livro). Ex: objeto ed instância de Editora ganha ed.livro_set):
>>> ed = Editora.objects.get(nome__icontains='norton') >>> ed <Editora: W. W. Norton & Company> >>> for l in ed.livro_set.all(): print l ... Colors of the World The Annotated Alice
OneToOneField: referência a objeto (chave estrangeira)
relação um-para-um:
class Criador(models.Model): nome = models.CharField(max_length=128) dt_nascimento = models.DateField(null=True, blank=True) livros = models.ManyToManyField(Livro, through='Credito') class Biografia(models.Model): sobre = models.OneToOneField(Criador) texto = models.TextField()objeto referente (criador) ganha um atributo dinâmico com o nome do modelo relacionado em caixa baixa (ex: instância c de Criador ganha c.biografia):
>>> lc = Criador.objects.get(id=1) >>> print lc.biografia.texto Charles Lutwidge Dodgson, ou Lewis Carrol foi um escritor e um matemático britânico...
ManyToManyField: referência a múltiplos objetos via tabela de ligação
- relação muitos-para-muitos
- objeto referente ganha um atributo dinâmico «modelo»_set (ver Campo de referência: ForeignKey)
- a tabela de ligação pode ser implícita ou explícita via parâmetro through
class Livro(models.Model):
titulo = models.CharField(max_length=256)
editora = models.ForeignKey('Editora')
assuntos = models.ManyToManyField('Assunto')
criadores = models.ManyToManyField('Criador', through='Credito')
class Credito(models.Model):
livro = models.ForeignKey(Livro)
criador = models.ForeignKey('Criador')
papel = models.CharField(max_length=64)
class Criador(models.Model):
nome = models.CharField(max_length=128)
dt_nascimento = models.DateField(null=True, blank=True)
Em ordem de utilidade (subjetiva).
Estabelece a ordenação padrão dos resultados consultas a este modelo. O valor deste atributo é uma sequência de nomes de campos. Use - como prefixo de um campo para definir ordem descendente:
ordering = ['-dt_publicacao', 'editoria']