Bij het schrijven van modellen in Django is een van de veelgebruikte veldopties blank=True en null=True. Beide opties bieden de mogelijkheid om een veld leeg te laten, maar ze verschillen in hun doel en werkelijke functie. In dit artikel worden de betekenis en de verschillen van elk van deze opties uitgelegd, evenals wanneer en hoe je ze kunt toepassen.


1. blank=True

De blank=True optie bepaalt of een veld kan worden leeggelaten tijdens de formulier validatiefase. Dit heeft voornamelijk betrekking op Django's formulieren.

  • Betekenis: Zorgt ervoor dat er geen validatiefouten optreden als het veld leeg is.
  • Toepassingssituatie: Wordt gebruikt als je toelating wilt geven dat een veld leeg is bij invoer van de gebruiker. Bijvoorbeeld, als een bepaald veld in de profielinformatie van de gebruiker niet verplicht is en kan worden overgeslagen, gebruik je blank=True.
from django.db import models

class Profile(models.Model):
    bio = models.TextField(blank=True)  # Invoerd veld voor zelfbeschrijving dat niet verplicht is

2. null=True

null=True staat toe dat de waarde van dat veld NULL kan zijn in de database. Dit bepaalt of lege waarden zijn toegestaan op database-niveau.

  • Betekenis: Staat toe dat een veld NULL waarde heeft in de database.
  • Toepassingssituatie: Wordt gebruikt wanneer je moet omgaan met lege waarden die in de database moeten worden opgeslagen. Als het geen stringveld is en null=True niet is ingesteld, slaat Django een standaardwaarde op in plaats van een lege waarde. Bijvoorbeeld, als je NULL wilt gebruiken wanneer er geen waarde is voor een datumn of getalveld, moet je null=True instellen.
from django.db import models

class Event(models.Model):
    end_date = models.DateTimeField(null=True)  # veld om evenementen zonder einddatum toe te staan

3. Het verschil tussen blank=True en null=True

Het verschil tussen de twee opties is voornamelijk gerelateerd aan formulier validatie en database opslagmethoden.

Optie Functieomschrijving Toepassingsdoel
blank=True Veld kan leeg zijn tijdens formulier validatie Gebruikersinvoer is niet verplicht
null=True Sta NULL waarde toe in de database Veld kan leeg zijn in de database

In Django staat blank=True voor het toestaan van leeglate tijdens formulierniveau en null=True voor het toestaan van leeglate op databasenniveau.


4. Wanneer gebruik je beide opties samen?

Over het algemeen wordt alleen voor stringvelden (CharField, TextField, enz.) blank=True ingesteld en wordt null=True niet gebruikt. Django behandelt lege strings ('') en NULL-waarden apart, zodat een lege string doorgaans als lege waarde in plaats van NULL wordt behandeld.

Aan de andere kant, als het gaat om niet-stringvelden (bijv. DateTimeField, IntegerField) en het veld niet verplicht is, is het aan te raden om zowel blank=True als null=True samen te gebruiken. Hierdoor kan het veld leeg blijven in het formulier en kan NULL-waarde in de database worden opgeslagen.

class Task(models.Model):
    name = models.CharField(max_length=200, blank=True)   # alleen blank=True voor stringvelden
    due_date = models.DateTimeField(blank=True, null=True) # use both blank=True and null=True voor datumvelden

5. Samenvatting

  • blank=True: Voorkomt dat er een fout optreedt als het veld leeg is in het formulier, voornamelijk gebruikt als gebruikersinvoer niet verplicht is.
  • null=True: Staat toe dat een veld NULL waarde heeft in de database, wordt gebruikt bij niet-stringvelden.
  • Gecombineerd gebruik: Gebruik blank=True en null=True samen als je niet-stringvelden optioneel leeg wilt laten.

Door deze twee opties op de juiste manier te gebruiken bij het ontwerpen van Django-modellen, kun je de flexibiliteit van de database-structuur en gebruikersinvoer vergroten.

In de volgende post zullen we kijken naar de related_name veldoptie die vaak wordt gebruikt bij het instellen van ForeignKey. Dit is ook een zeer nuttige optie in ORM, dus ik hoop dat je ook naar de volgende post zult kijken.