2017-10-21 7 views
0

Ich benutze Django seit über 3 Jahren, habe aber nie das Bedürfnis verspürt, DRF zu verwenden. Angesichts der wachsenden Beliebtheit von DRF dachte ich darüber nach, es einmal auszuprobieren.Django DRF - Was ist der Einsatz von Serialisierern?

Serialisierung ist das Konzept, das ich am schwierigsten finde. Betrachten Sie zum Beispiel: - Ich möchte Benutzerdetails speichern. Im Folgenden sind die benutzerbezogenen Modelle.

class Users(models.Model): 
    GENDER_CHOICES = (
     ('M', 'MALE'), 
     ('F', 'FEMALE'), 
     ('O', 'OTHERS'), 
    ) 
    first_name = models.CharField(max_length=255, blank=True, null=True) 
    middle_name = models.CharField(max_length=255, blank=True, null=True) 
    last_name = models.CharField(max_length=255, blank=True, null=True) 
    gender = models.CharField(choices=GENDER_CHOICES, max_length=1, blank=True, 
           null=True) 


class UserAddress(models.Model): 
    ADDRESS_TYPE_CHOICES = (
     ('P', 'Permanent'), 
     ('Cu', 'Current'), 
     ('Co', 'Correspondence') 
    ) 
    line1 = models.CharField(max_length=255) 
    line2 = models.CharField(max_length=255, blank=True, null=True) 
    pincode = models.IntegerField() 
    address_type = models.CharField(choices=ADDRESS_TYPE_CHOICES, 
            max_length=255) 
    user_id = models.ForeignKey(Users, related_name='uaddress') 


class UserPhone(models.Model): 
    phone = models.CharField(max_length=10) 
    user_id = models.ForeignKey(Users, related_name='uphone') 


class UserPastProfession(models.Model): 
    profession = models.CharField(max_length=10) # BusinessMan, software Engineer, Artist etc. 
    user_id = models.ForeignKey(Users, related_name='uprofession') 

Ich bekomme alle Benutzerdetails gebündelt in einem POST-Endpunkt.

{ 
    'first_name': 'first_name', 
    'middle_name': 'middle_name', 
    'last_name': 'last_name', 
    'gender': 'gender', 
    'address': [{ 
     'line1': 'line1', 
     'line2': 'line2', 
     'address_type': 'address_type', 
    }], 
    'phone': ['phone1', 'phone2'], 
    'profession': ['BusinessMan', 'Software Engineer', 'Artist'] 
} 

Ohne DRF zu verwenden, würde ich ein Users Objekt zunächst, es mit UserAddress, UserPhone und UserPastProfession Object Linking gemacht haben.

Wie könnte das gleiche mit DRF getan werden? Ich meine validating, serializing, und dann speichern Sie die Details. Wie sieht die Datei serializers.py aus?

+2

Haben Sie sich die DRF durch Quick Start Guide und seinen Abschnitt über Serialisierer (und lesen Sie auf verschachtelten Serialisierer)? Haben Sie ein spezielles Problem, dass Sie einen Serializer schreiben, da dies im Moment als "Kann mir jemand einen Serialisierer für meinen Code schreiben" interpretiert werden kann. –

+0

@JonClements - Ich habe versucht, einen Serialisierer zu schreiben, aber verstehe nicht, wie man ihn benutzt, wenn das gleiche mit den rohen Django-Befehlen (mit weniger Code) gemacht werden kann. Ich fordere niemanden auf, Code für mich zu schreiben, sondern wollte nur die Verwendung desselben vergleichen und verstehen. – PythonEnthusiast

+0

Und es kann nicht immer verschachtelt werden. Kann es sein? Was passiert, wenn die Details zu Telefon, Adresse und Beruf über verschiedene Endpunkte mit der zugehörigen Benutzer-ID gesendet werden? Wird es immer noch ein verschachtelter Serializer sein? – PythonEnthusiast

Antwort

2

Wenn ich Sie richtig bekam, meine Antwort ist:

Es ist nicht notwendig, ein Serializer für ein Modell zu schreiben, auch für Methodentyp (POST, GET etc.). Sie können so gut wie nötig Serialisierer für Ihr Modell erstellen und Felder festlegen, auf denen Sie arbeiten möchten. Sie können diese verschiedenen Serializer auch als serializer_class-Eigenschaft Ihrer APIView-Klasse für jede Methode festlegen.

Ich empfehle Ihnen dringend, einige Zeit in Anspruch nehmen unter der unten genannten Django Rest Framework Tutorial

0

aussehen wird, wie Sie Ihre Serializer .. aussehen kann, aber bitte dieses DRF serializer realtionship

from rest_framework.serializers import (
    ModelSerializer, 
    PrimaryKeyRelatedField 
) 

class UserSerializer(ModelSerializer): 
    """ 
    Serializer for the users models.. Please dont forget to import the model 
    """ 
    class Meta: 
     model = Users 
     field = "__all__" 


class UserPhoneSerializer(ModelSerializer): 
    """ 
    Serializer for the users address model.. 
    Pass the previously created user id within the post.. serializer will automatically validate 
    it 
    """ 

    user_id = PrimaryKeyRelatedField(queryset=Users.objects.all()) 
    class Meta: 
     model = UserPhone 
     field = "__all__" 

class UserAddressSerializer(ModelSerializer): 
    """ 
    Serializer for the users address model.. 
    Pass the previously created user id within the post.. serializer will automatically validate 
    it 
    """ 

    user_id = PrimaryKeyRelatedField(queryset=Users.objects.all()) 
    class Meta: 
     model = UserAddress 
     field = "__all__" 


class UserPastProfessionSerializer(ModelSerializer): 
    """ 
    Serializer for the UserPastProfession model.. 
    Pass the previously created user id within the post.. serializer will automatically validate 
    it 
    """ 
    user_id = PrimaryKeyRelatedField(queryset=Users.objects.all()) 

    class Meta: 
     model = UserPastProfession 
     field = "__all__" 
Verwandte Themen