2017-05-08 12 views
1

これは特定のユースケースの質問ではありませんが、私の経験でAPIをやっていること、特にDjangoとDjango Rest Frameworkを使用して気づいたことがあります。Django Rest Frameworkでモデルの変更を処理する方法は?

何ヶ月も前に、私はクライアントのプロジェクトのために維持しているAPIに問題がありました。

class Person: 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 

その後、対応するシリアライザ:もちろん

class PersonSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 
     fields = '__all__' 

は、そのは、ビューセットおよびルートがそれを指す対応:

http://localhost:8000/api/v1/persons/ 

のは、我々は以下のモデルがあるとしましょう

これは私のAPIの第1版であることに注意してください。

この時点ですべて正常ですか?

は今、私のクライアントはなったように、私はあることを私のモデルを変更する必要があります...私たちは、別途代わりに姓と名の人のフルネームを受信する必要があること

を尋ねた:

class Person: 
    full_name = models.CharField(max_length=200) 

このバージョンのAPIを使用するクライアント(モバイルアプリ)は3種類あります。明らかに私はAPIを変更したくないのですが、新しいアプローチを新しいバージョンに入れたいと思っています。

が、この時点でAPI の第一バージョンが既に

を変更するように、第一のバージョンのシリアライザは、私は以下の回答で読むことを期待するもの、モデルと連結されているが、あなたたちはこの問題に対処する方法でありますDjangoと私は同じスタックを使って次のプロジェクトに取り掛かるべきです。

編集:私の質問は、APIとモデルをモデルから切り離す方が良いかどうかを理解することです。私は非常に基本的な例を示しましたが、事態がますます複雑になるケースがあります。たとえば、中間テーブルにフィールドを追加するために、throughオプションを使用するようにM2Mリレーションシップを変更する必要がありました。

答えて

1

「おすすめのスムース」と表示される可能性のある質問のタイプですが、それは何でも可能です。

まず、full_nameフィールドでモデルを拡張する必要があります。あなたがモデルに書き込みできるようにする必要がある場合は、あなたのAPIからfull_nameを提供するには、あなたはあなたにもあるので、シリアライザ

class PersonSerializer(serializers.ModelSerializer): 
    full_name = serializers.CharField() # if you have property 
    class Meta: 
     model = Person 
     fields = '__all__' 

のフィールドを含めることができそうでなければ、次にproperty

@property 
def full_name(self): 
    return '{} {}'.format(self.first_name, self.last_name) 

を扱うことができ、フィールドで拡張する必要がありますあなたはクラスのフィールド名とシリアライザのフィールド名が一致するので、心配する必要はありません。

追加フィールドがあると、クライアントが壊れず、大きなクライアントを満足することはありません。

+0

「おすすめ商品」とはどういう意味ですか?複雑なケースでは、たとえば、中間テーブルにさらにフィールドが必要なため、M2Mフィールドを変更してスルーオプションを使用する必要がありました。私の質問のobjetiveは、モデルからAPIをデカップリングする方が良いかどうかを理解することです... –

関連する問題