Το Django REST Framework (DRF) είναι το de facto standard για την κατασκευή REST APIs με Django, και τα serializers είναι η βασική του έννοια. Ένα serializer μετατρέπει σύνθετα δεδομένα (model instances, querysets) σε JSON για απαντήσεις API, και μετατρέπει εισερχόμενο JSON πίσω σε validated Python objects — χειρίζεται τόσο serialization όσο και validation, όπως κάνουν τα forms για HTML.
ModelSerializer — η συνήθης περίπτωση
from rest_framework import serializers
from .models import Article
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = Article # build from a model (DRY)
fields = ["id", "title", "body", "published", "created_at"]
read_only_fields = ["id", "created_at"]
Ενα ModelSerializer δημιουργεί αυτόματα fields από το model (όπως ένα ModelForm) — ελάχιστος κώδικας για να serialize και να validate ένα model.
Serializing: object → JSON
article = Article.objects.get(pk=1)
serializer = ArticleSerializer(article)
serializer.data # {"id": 1, "title": "Hello", "body": "...", ...} → return as JSON
# serialize a queryset (many objects)
serializer = ArticleSerializer(Article.objects.all(), many=True)
serializer.data # a list of dicts
Deserializing + validation: JSON → validated object
serializer = ArticleSerializer(data=request.data) # incoming JSON
if serializer.is_valid(): # VALIDATE (like a form)
article = serializer.save() # create/update the model
else:
return Response(serializer.errors, status=400) # validation error details
Το pattern είναι παρόμοιο με τα forms: is_valid() επικυρώνει εισερχόμενα δεδομένα ενάντια στους κανόνες field και στο model, και save() το αποθηκεύει. Τα μη έγκυρα δεδομένα δίνουν δομημένα μηνύματα σφάλματος.
Custom validation και fields
class ArticleSerializer(serializers.ModelSerializer):
word_count = serializers.SerializerMethodField() # a computed, read-only field
def get_word_count(self, obj):
return len(obj.body.split())
def validate_title(self, value): # field-level validation
if "spam" in value.lower():
raise serializers.ValidationError("No spam")
return value
Nested serializers (συσχετισμένα δεδομένα)
class AuthorSerializer(serializers.ModelSerializer):
class Meta: model = Author; fields = ["name"]
class ArticleSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True) # embed related author data
class Meta: model = Article; fields = ["title", "author"]
Τα serializers μπορούν να ενσωματώνονται για να αναπαριστούν συσχετισμένα objects (ενσωμάτωση των δεδομένων ενός συγγραφέα μέσα στο JSON ενός άρθρου) — και εσείς ελέγχετε το σχήμα του API ανεξάρτητα από τη βάση δεδομένων.
Γιατί έχει σημασία
Τα serializers είναι η γωνιακή λίθος της κατασκευής REST APIs με Django REST Framework, το οποίο είναι το standard εργαλείο για Django APIs — οπότε η κατανόησή τους είναι απαραίτητη για κάθε σύγχρονο Django back-end που εξυπηρετεί JSON σε frontends, mobile apps, ή άλλες υπηρεσίες.
Τα serializers επιλύουν τις δύο θεμελιώδεις ανάγκες ενός API: μετατροπή δεδομένων Python/model σε JSON για responses (serialization) και μετατροπή εισερχόμενου JSON σε validated Python objects για δημιουργία/ενημέρωση δεδομένων (deserialization + validation).
Η πτυχή validation είναι κρίσιμη για ασφάλεια και ευστάθεια — όπως τα forms για HTML, τα serializers εξασφαλίζουν ότι δεν εμπιστεύεστε ποτέ τα surraw API input, επικυρώνοντας το ενάντια στους κανόνες field πριν φτάσει στη βάση δεδομένων. Το ModelSerializer παρέχει μεγάλο κέρδος παραγωγικότητας με αυτόματη δημιουργία fields από models (DRY, όπως ModelForm), κάνοντας τετριμμένο να εκθέσετε models ως API resources, ενώ το pattern is_valid()/save() χειρίζεται το πλήρες create/update lifecycle καθαρά.
Η κατανόηση του τρόπου serialization objects και querysets, deserialization και validation input, προσθήκη custom validation και computed fields, και χρήση nested serializers για συσχετισμένα δεδομένα (ελέγχος του σχήματος του API ανεξάρτητα από το database schema) είναι θεμελιώδη για την κατασκευή APIs.
Τα serializers είναι το σημείο όπου το DRF χειρίζεται τις βασικές API ανησυχίες της μετατροπής και validation δεδομένων, κάνοντάς τα κεντρική, must-know γνώση — ανάλογη σε σημασία με τα forms για traditional Django, αλλά για τις API-driven εφαρμογές που κυριαρχούν στη σύγχρονη ανάπτυξη web.
