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
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 serializersfrom django.contrib.auth.models import Userfrom .models import Articleclass AuthorSerializer(serializers.ModelSerializer):full_name = serializers.SerializerMethodField()article_count = serializers.SerializerMethodField()class Meta:model = Userfields = ['id', 'username', 'full_name', 'article_count']def get_full_name(self, obj):return f"{obj.first_name} {obj.last_name}".strip() or obj.usernamedef 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 = Articlefields = ['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