Quando adicionamos um campo de banco de dados no django, geralmente escrevemos:
models.CharField(max_length=100, null=True, blank=True)
O mesmo é feito com ForeignKey
, DecimalField
etc. Qual é a diferença básica em ter
null=True
sóblank=True
sónull=True
,blank=True
no que diz respeito a diferentes ( CharField
, ForeignKey
, ManyToManyField
, DateTimeField
campos). Quais são as vantagens / desvantagens de usar 1/2/3?
python
django
django-models
user993563
fonte
fonte
ForeignKey
comblank=True
, mas semnull=True
. Quando o modelo é salvo, quero "publicá-lo" automaticamente, criando uma entrada publicada a partir dele. Portanto, não posso salvarnull
no banco de dados, pois todos os modelos precisam ser "publicados", mas quero poder deixar o campo vazio no admin.Respostas:
null=True
defineNULL
(versusNOT NULL
) na coluna em seu banco de dados. Valores em branco para tipos de campos do Django, comoDateTimeField
ouForeignKey
serão armazenados comoNULL
no banco de dados.blank
determina se o campo será obrigatório em formulários. Isso inclui o administrador e seus formulários personalizados. Seblank=True
então, o campo não será obrigatório, enquanto que se for,False
o campo não poderá ficar em branco.A combinação dos dois é tão frequente, porque normalmente, se você deseja que um campo fique em branco em seu formulário, também precisará do seu banco de dados para permitir
NULL
valores para esse campo. A exceção éCharField
s eTextField
s, que no Django nunca são salvos comoNULL
. Os valores em branco são armazenados no banco de dados como uma sequência vazia (''
).Alguns exemplos:
Obviamente, essas duas opções não fazem sentido lógico para usar (embora possa haver um caso de uso,
null=True, blank=False
se você quiser que um campo seja sempre exigido em formulários, opcional ao lidar com um objeto por meio de algo como o shell).CHAR
eTEXT
tipos nunca são salvos comoNULL
no Django, entãonull=True
é desnecessário. No entanto, você pode definir manualmente um desses camposNone
para forçá-lo a defini-lo comoNULL
. Se você tiver um cenário em que isso seja necessário, você ainda deve incluirnull=True
.fonte
IntegrityError
é gerado quando o Django tenta salvar o registro no banco de dados. O campo não precisa ser preenchido pelo usuário, e esse é o problema, porque no nível do banco de dados não é nulo.CHAR
eTEXT
NUNCA são salvos comoNULL
pelo Django". É verdade para a maioria dos backends, mas a Oracle irá forçar uma seqüência vazia para NULL, então o back-end Django Oracle é uma exceção à declaração acima Django DocsNone
Python) se você definir null = True. Os documentos dizem até para evitar definir null = True, pois permite dois tipos diferentes de valores "em branco". Eu só testei este comportamento com Django 1.8 / MySQL 5.6blank=True
,null=False
,default="something"
?É assim que o ORM mapeia
blank
enull
campos para o Django 1.8Os campos do banco de dados criados para o PostgreSQL 9.4 são:
Os campos do banco de dados criados para o MySQL 5.6 são:
fonte
blank
não tem efeito no banco de dados enull
controla se a coluna do banco de dados permiteNULL
valores. Esta resposta é realmente uma maneira longa de dizer isso e não fornece nenhuma informação útil sobreblank
.blank
enull
deve ser refletido nas colunas do banco de dados, quando na verdadeblank
afeta apenas o manuseio do Python, não as colunas do banco de dados. Outros são livres de votar se acharem útil; também é possível que as pessoas que são enganadas por uma resposta enganosa pensem que foi útil.Como dito na referência do Django Model Field: Link
fonte
É crucial entender que as opções em uma definição de campo de modelo do Django servem (pelo menos) a dois propósitos: definir as tabelas do banco de dados e definir o formato padrão e a validação dos formulários do modelo. (Eu digo "padrão" porque os valores sempre podem ser substituídos fornecendo um formulário personalizado.) Algumas opções afetam o banco de dados, algumas opções afetam os formulários e outras afetam os dois.
Quando se trata de
null
eblank
, outras respostas já deixaram claro que o primeiro afeta a definição da tabela do banco de dados e o segundo afeta a validação do modelo. Penso que a distinção pode ser ainda mais clara observando os casos de uso para todas as quatro configurações possíveis:null=False
,blank=False
: Esta é a configuração padrão e significa que o valor é necessário em todas as circunstâncias.null=True
,blank=True
: Isso significa que o campo é opcional em todas as circunstâncias. (Conforme observado abaixo, porém, essa não é a maneira recomendada de tornar opcionais os campos baseados em string.)null=False
,blank=True
: Isto significa que o formulário não requerem um valor, mas o banco de dados faz. Existem vários casos de uso para isso:O uso mais comum é para campos opcionais baseados em sequência. Conforme observado na documentação , o idioma do Django é usar a string vazia para indicar um valor ausente. Se
NULL
também fosse permitido, você terminaria com duas maneiras diferentes de indicar um valor ausente.Outra situação comum é que você deseja calcular um campo automaticamente com base no valor de outro (no seu
save()
método, digamos). Você não deseja que o usuário forneça o valor em um formulário (portantoblank=True
), mas deseja que o banco de dados imponha que um valor sempre seja fornecido (null=False
).Outro uso é quando você deseja indicar que a
ManyToManyField
é opcional. Como esse campo é implementado como uma tabela separada e não como uma coluna do banco de dados,null
não faz sentido . O valor deblank
ainda afetará as formas, porém, controlando se a validação será ou não bem-sucedida quando não houver relações.null=True
,blank=False
: Significa que o formulário requer um valor, mas o banco de dados não. Essa pode ser a configuração usada com menos frequência, mas existem alguns casos de uso para isso:É perfeitamente razoável exigir que seus usuários sempre incluam um valor, mesmo que não seja realmente exigido pela sua lógica de negócios. Afinal, os formulários são apenas uma maneira de adicionar e editar dados. Você pode ter um código que está gerando dados que não precisa da mesma validação rigorosa que você deseja exigir de um editor humano.
Outro caso de uso que eu vi é quando você tem um
ForeignKey
para o qual não deseja permitir exclusão em cascata . Ou seja, no uso normal, a relação deve sempre estar lá (blank=False
), mas se o item para o qual ela foi excluída for excluído, você também não deseja que esse objeto seja excluído. Nesse caso, você pode usarnull=True
eon_delete=models.SET_NULL
implementar um tipo simples de exclusão suave .fonte
Você pode ter sua resposta, no entanto, até hoje, é difícil julgar se nulo = Verdadeiro ou em branco = Verdadeiro ou ambos em um campo. Pessoalmente, acho que é bastante inútil e confuso fornecer tantas opções aos desenvolvedores. Deixe o manipular os nulos ou espaços em branco da maneira que eles desejarem.
Sigo esta tabela, de Two Scoops of Django :
fonte
Simplesmente
null=True
define que o banco de dados deve aceitarNULL
valores; por outro lado,blank=True
na validação do formulário, este campo deve aceitar valores em branco ou não (seblank=True
ele aceitar um formulário sem um valor nesse campo eblank=False
[valor padrão] na validação do formulário, será exibido Este erro é obrigatório .null=True/False
relacionado ao banco de dadosblank=True/False
relacionado à validação de formuláriofonte
Aqui está um exemplo do campo com
blank= True
enull=True
description = models.TextField (em branco = True, null = True)
Nesse caso::
blank = True
diz ao nosso formulário que não há problema em deixar o campo de descrição em brancoe
null = True
: diz ao nosso banco de dados que não há problema em registrar um valor nulo no nosso campo db e não dar erro.fonte
Significa que não há restrição de banco de dados para o campo a ser preenchido, portanto, você pode ter um objeto com valor nulo para o preenchido que possui essa opção.
Significa que não há restrição de validação em formas de django. portanto, ao preencher um
modelForm
para este modelo, você pode deixar o campo com essa opção não preenchida.fonte
Aqui está a principal diferença de
null=True
eblank=True
:O valor padrão de ambos
null
eblank
é Falso. Ambos os valores funcionam no nível do campo, ou seja, se queremos manter um camponull
oublank
.null=True
irá definir o valor do campo comoNULL
ie, sem dados. É basicamente para o valor da coluna de bancos de dados.blank=True
determina se o campo será obrigatório em formulários. Isso inclui o administrador e seus próprios formulários personalizados.title = models.CharField(blank=True) // title can be kept blank.
No banco de dados("")
serão armazenados.null=True
blank=True
Isso significa que o campo é opcional em todas as circunstâncias.fonte
Os valores padrão de null e blank são False.
Nulo: está relacionado ao banco de dados. Define se uma determinada coluna do banco de dados aceitará valores nulos ou não.
Em branco: está relacionado à validação. Ele será usado durante a validação de formulários, ao chamar form.is_valid ().
Dito isto, é perfeitamente bom ter um campo com null = True e em branco = False. Significado no nível do banco de dados, o campo pode ser NULL, mas no nível do aplicativo, é um campo obrigatório.
Agora, onde a maioria dos desenvolvedores erra: Definindo null = True para campos baseados em string, como CharField e TextField. Evite fazer isso. Caso contrário, você terá dois valores possíveis para "sem dados", ou seja: Nenhum e uma sequência vazia. Ter dois valores possíveis para "sem dados" é redundante. A convenção do Django é usar a string vazia, não NULL.
fonte
Quando salvamos algo no admin do Django, ocorre a validação de duas etapas, no nível do Django e no banco de dados. Não podemos salvar texto em um campo numérico.
O banco de dados tem o tipo de dados NULL, não é nada. Quando o Django cria colunas no banco de dados, ele especifica que elas não podem estar vazias. E se você tentar salvar NULL, receberá o erro do banco de dados.
Também no nível do Django-Admin, todos os campos são obrigatórios por padrão, você não pode salvar o campo em branco, o Django gera um erro.
Portanto, se você deseja salvar um campo em branco, é necessário permiti-lo no nível do Django e do banco de dados. blank = True - permitirá campo vazio no painel de administração null = True - permitirá salvar NULL na coluna do banco de dados.
fonte
Há um ponto em
null=True
que seria necessário mesmo em umCharField
ouTextField
e é quando o banco de dados tem ounique
sinalizador definido para a coluna.Em outras palavras, se você possui um Char / TextField exclusivo no Django, precisará usar isso:
Para CharField ou TextField não exclusivo, é melhor ignorar o
null=True
caso contrário, alguns campos serão definidos como NULL enquanto outros como "", e você precisará verificar o valor do campo para NULL sempre.fonte
null é para banco de dados e em branco é para validação de campos que você deseja mostrar na interface do usuário como campo de texto para obter o sobrenome da pessoa. Se lastname = models.charfield (em branco = true), ele não solicitou ao usuário para inserir o sobrenome, pois esse é o campo opcional agora. Se lastname = models.charfield (null = true) , significa que, se esse campo não obtiver nenhum valor do usuário, ele será armazenado no banco de dados como uma string vazia "".
fonte
O significado de null = True e em branco = True no modelo também depende de como esses campos foram definidos na classe de formulário.
Suponha que você definiu a seguinte classe:
Se a classe do formulário tiver sido definida assim:
Em seguida, o campo 'nome' não será obrigatório (devido ao espaço em branco = Verdadeiro no modelo) e o campo 'endereço' será obrigatório (devido ao espaço em branco = Falso no modelo).
No entanto, se a classe ClientForm tiver sido definida assim:
Então, os dois campos ('nome' e 'endereço') serão obrigatórios " , pois os campos definidos declarativamente são deixados como estão" ( https://docs.djangoproject.com/en/3.0/topics/forms/modelforms/ ) , ou seja, o padrão para o atributo 'obrigatório' do campo do formulário é True e isso exigirá que os campos 'name' e 'address' sejam preenchidos, mesmo que, no modelo, o campo tenha sido definido como blank = True.
fonte
null - o padrão é False se True, o Django armazenará vazio como nulo no banco de dados.
em branco - o padrão é False se for verdade que esse campo pode ficar em branco
mais, vá para https://docs.djangoproject.com/en/3.0/topics/db/models/
fonte
Esta tabela abaixo demonstra as principais diferenças:
fonte
Em palavras muito simples ,
Em branco é diferente de nulo.
null é puramente relacionado ao banco de dados , enquanto o branco é relacionado à validação (obrigatório no formulário) .
Se o
null=True
Django quiserstore empty values as NULL in the database
. Se um campo tiverblank=True
, a validação do formulário seráallow entry of an empty value
. Se um campo estiver em branco = False, o campo será obrigatório.fonte