0 Tage Serie
python / intermediate
Snippet

Django REST Framework Benutzerdefinierte Serialisierer mit SerializerMethodField

Benutzerdefinierte Serialisierer in Django REST Framework ermöglichen es Ihnen, Modelldaten in JSON-Darstellungen zu transformieren, die auf Ihre API-Anforderungen zugeschnitten sind. Das SerializerMethodField ist besonders nützlich, wenn Sie Werte berechnen müssen, die nicht direkt im Model vorhanden sind, wie z.B. ein vollständiger Name eines Benutzers, der Vorname und Nachname kombiniert, oder aggregierte Daten wie Artikelanzahl.

snippet.py
python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Article
class AuthorSerializer(serializers.ModelSerializer):
full_name = serializers.SerializerMethodField()
article_count = serializers.SerializerMethodField()
class Meta:
model = User
fields = ['id', 'username', 'full_name', 'article_count']
def get_full_name(self, obj):
return f"{obj.first_name} {obj.last_name}".strip() or obj.username
def get_article_count(self, obj):
return obj.articles.count()
class ArticleSerializer(serializers.ModelSerializer):
author = AuthorSerializer(read_only=True)
tags = serializers.StringRelatedField(many=True)
class Meta:
model = Article
fields = ['id', 'title', 'content', 'author', 'tags', 'created_at']
django
Erklärung
1
from rest_framework import serializers
Importiere das serializers-Modul von DRF für ModelSerializer und benutzerdefinierte Feldtypen
2
from django.contrib.auth.models import User
Importiere Djangos eingebautes User-Model zum Serialisieren von Benutzerdaten
3
full_name = serializers.SerializerMethodField()
Definiere ein berechnetes Feld, das die Methode get_full_name aufruft, um Vor- und Nachname zu kombinieren
4
def get_full_name(self, obj):
Benutzerdefinierte Methode erhält die Modelinstanz als obj und gibt den berechneten Wert zurück
5
return f"{obj.first_name} {obj.last_name}".strip() or obj.username
Formatiere den Namen sicher, gebe Benutzernamen zurück, wenn Vor-/Nachname leer sind
6
def get_article_count(self, obj):
Ein weiteres SerializerMethodField, das über die Reverse-Relation zugehörige Artikel zählt
7
author = AuthorSerializer(read_only=True)
Verschachtelter Serialisierer bettet den vollständigen AuthorSerializer in ArticleSerializer ein