2017-10-21 29 views
0

私はDjangoを3年以上使用してきましたが、DRFを使用する必要性を感じたことはありません。しかし、DRFの人気が高まっているのを見て、私はそれを試してみることを考えました。Django DRF - シリアライザの用途は何ですか?

をシリアライズするのが最も難しいと考えています。たとえば、次のように考えてみましょう。 - ユーザーの詳細を保存したい以下はユーザー関連のモデルです。

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') 

すべてのユーザーの詳細が1つのPOSTエンドポイントにまとめられています。

{ 
    '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'] 
} 

DRFを使用しなければ、私はUserAddressUserPhoneUserPastProfessionオブジェクトとそれを結ぶ、最初Usersオブジェクトを作っているだろう。

DRFを使用して同じことを行う方法は?私はvalidatingserializingを意味して、詳細を保存します。 serializers.pyファイルの見た目は?

+2

を通過してください、あなたはDRF見てきましたクイックスタートガイドとシリアライザに関するセクション(ネストされたシリアライザを読む)シリアライザを作成している特定の問題がありますか?これは、「誰かが私のコードのシリアライザを書いてくれますか?」と解釈される可能性があります。 –

+0

@JonClements - 私はシリアライザを書こうとしましたが、同じことがDjangoの生のコマンド(少ないコード)を使って行うことができるときには、その使い方を理解できません。私は誰にもコードを書くよう求めているわけではありませんが、同じものの使い方を比較して理解したかっただけです。 – PythonEnthusiast

+0

そして常にネストすることはできません。それはできますか?電話、住所、職種の詳細が、関連付けられたユーザーIDを使用して異なるエンドポイントでPOSTされている場合はどうなりますか?まだネストされたserialzersになりますか? – PythonEnthusiast

答えて

2

私が正しくあなたを得た場合、私の答えは次のとおりです。

それも方法のタイプ(POST、GETなど)のために、モデルの1つのシリアライザを記述する必要はありません。モデルのシリアライザを必要なだけ作成し、操作したいフィールドを設定することができます。これらの異なるシリアライザは、各メソッドごとにAPIViewクラスのserializer_classプロパティとして設定することもできます。

私は強く以下Django Rest Framework Tutorial

0

を見ていくつかの時間を取ることをお勧めしますあなたのシリアライザを見ることができる方法です..しかし、この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__" 
関連する問題