Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Django REST framework - DjangoConG 2015
Search
Ordoquy Xavier - Linovia
May 09, 2015
Programming
150
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Django REST framework - DjangoConG 2015
A few non trivial use cases with Django REST framework
Ordoquy Xavier - Linovia
May 09, 2015
More Decks by Ordoquy Xavier - Linovia
See All by Ordoquy Xavier - Linovia
SQLAlchemy - un ami qui vous veut du bien
xordoquy
0
20
pycon.fr 2018 - Django REST framework workshop
xordoquy
0
350
mauvaises bonnes idées pour REST
xordoquy
1
400
Authentication and Permissions with Django REST framework
xordoquy
0
200
Buildbot 0.9
xordoquy
0
110
Performances Django REST framework - DjangoCong 2016
xordoquy
0
130
Présentation de l'architecture REST - meetup Django Paris
xordoquy
0
110
Django REST framework workshop @Djangocon Europe 2015
xordoquy
0
130
Django REST framework workshop - DjangoCong 2015
xordoquy
1
130
Other Decks in Programming
See All in Programming
dRuby over BLE
makicamel
2
380
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
550
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
200
The NotImplementedError Problem in Ruby
koic
1
880
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
210
1B+ /day規模のログを管理する技術
broadleaf
0
100
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.3k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
170
Agentic UI
manfredsteyer
PRO
0
180
New "Type" system on PicoRuby
pocke
1
990
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.7k
ふつうのFeature Flag実践入門
irof
8
4.1k
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
430
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Bash Introduction
62gerente
615
220k
Navigating Team Friction
lara
192
16k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
170
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
600
Transcript
Xavier Ordoquy @linovia_net irc:linovia
Ajouter des données à la création # ViewSet: def perform_create(self,
serializer): serializer.save(owner=request.user) # Serializer: def create(self, validated_data): # process validated_data['owner'] return Task.objects.create(**validated_data)
Sans modèle ?
from rest_framework import routers router = routers.SimpleRouter() router.register(r'task', TaskViewSet, base_name='task')
urlpatterns = router.urls Sans modèle ? class TaskViewSet(viewsets.ViewSet): def list(self, request): # Recuperation des taches return tasks def retrieve(self, request, pk=None): # Récupération de la tache return task
serializers et contextes • Serializer et Fields ont parfois besoin
d’un contexte: • URL complète pour hyperlink • Utile pour « to_representation »
class PostSerializer(serializers.ModelSerializer): fav = serializers.SerializerMethodField('liked') def liked(self, obj): request =
self.context.get('request', None) if request is not None: return Favorite.objects.filter( user=request.user, post_id=obj.id).exists() return "error" class Meta: model = Post fields = ('fav', 'name') serializers et contextes
owner = serializers.HiddenField( default=CurrentUserDefault() ) class CurrentUserDefault(object): def set_context(self, serializer_field):
self.user = serializer_field.context['request'].user def __call__(self): return self.user def __repr__(self): return unicode_to_repr('%s()' % self.__class__.__name__) serializers et contextes
Plusieurs serializers class MultiSerializerViewSetMixin(object): def get_serializer_class(self): """ Thanks gonz: http://stackoverflow.com/a/22922156/11440
""" try: return self.serializer_action_classes[self.action] except (KeyError, AttributeError): return super( MultiSerializerViewSetMixin, self).get_serializer_class()
class CreateUserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('email',
'username', 'password') extra_kwargs = {'password': {'write_only': True}} Personnalisation d’un champ
Représentations imbriquées { "name": "Estimation #45", "client": { "name": "Client
idéal", "phone": "0101010101" }, "items": [{ "name": "Specification", "quantity": 2, }, { "name": "Tests", "quantity": 10, }] } class Estimate(models.Model): name = models.CharField(max_length=64) client = models.ForeignKey(User) items = models.ManyToManyField(Item)
Serializer class EstimateSerializer(serializers.ModelSerializer): client = ClientSerializer() items = ItemsSerializer() class
Meta: model = Estimate fields = ('name', 'client', 'items') def create(self, validated_data): client_data = validated_data.pop('client') items_data = validated_data.pop('items') client = Client.objects.get_or_create(**client_data) est = Est.objects.create(client=client, **validated_data) for item in items_data: Item.objects.create(estimate=est, **items_data) return est
Serializer class EstimateSerializer(serializers.ModelSerializer): client = ClientSerializer() items = ItemsSerializer() class
Meta: model = Estimate fields = ('name', 'client', 'items') def create(self, validated_data): client_data = validated_data.pop('client') items_data = validated_data.pop('items') client = Client.objects.get_or_create(**client_data) est = Est.objects.create(client=client, **validated_data) for item in items_data: Item.objects.create(estimate=est, **items_data) return est
Serializer class EstimateSerializer(serializers.ModelSerializer): client = ClientSerializer() items = ItemsSerializer() class
Meta: model = Estimate fields = ('name', 'client', 'items') def create(self, validated_data): client_data = validated_data.pop('client') items_data = validated_data.pop('items') client = Client.objects.get_or_create(**client_data) est = Est.objects.create(client=client, **validated_data) for item in items_data: Item.objects.create(estimate=est, **items_data) return est
Serializer class EstimateSerializer(serializers.ModelSerializer): client = ClientSerializer() items = ItemsSerializer() class
Meta: model = Estimate fields = ('name', 'client', 'items') def create(self, validated_data): client_data = validated_data.pop('client') items_data = validated_data.pop('items') client = Client.objects.get_or_create(**client_data) est = Est.objects.create(client=client, **validated_data) for item in items_data: Item.objects.create(estimate=est, **items_data) return est
Serializer class EstimateSerializer(serializers.ModelSerializer): client = ClientSerializer() items = ItemsSerializer() class
Meta: model = Estimate fields = ('name', 'client', 'items') def create(self, validated_data): client_data = validated_data.pop('client') items_data = validated_data.pop('items') client = Client.objects.get_or_create(**client_data) est = Est.objects.create(client=client, **validated_data) for item in items_data: Item.objects.create(estimate=est, **items_data) return est
Serializer class EstimateSerializer(serializers.ModelSerializer): client = ClientSerializer() items = ItemsSerializer() class
Meta: model = Estimate fields = ('name', 'client', 'items') def create(self, validated_data): client_data = validated_data.pop('client') items_data = validated_data.pop('items') client = Client.objects.get_or_create(**client_data) est = Est.objects.create(client=client, **validated_data) for item in items_data: Item.objects.create(estimate=est, **items_data) return user
allow_null allow_blank required allow_null allow_blank Django Django REST framework
{ "task": "Troller Jean Michel" } { "task": "Troller Jean
Michel", "owner": None } { "task": "Troller Jean Michel", "owner": "" } { "task": "Troller Jean Michel", "owner": "Mat" }
Validation des données: 2 écoles • Tout dans le serializer
• Deux passes: • Validation avec l’extérieur • Validation des règles du modèle
Validation serializer print(repr(t)) Task(): id = IntegerField(label='ID', read_only=True) name =
CharField(max_length=64) owner = SlugRelatedField( queryset=[<User: admin>, <User: toto>], slug_field='username') categories = SlugRelatedField(many=True, queryset=[<Category: pouet>, <Category: Django>], slug_field='name') done = BooleanField(required=False)
Questions