「リードエンジニアから学ぶMedPeerのプロダクト開発」 https://medpeer.connpass.com/event/181835/
この記事は筆者が調べ直してないものなので正確性に欠ける場合があります。 Hydratorパターン, hydrate メソッド PHP に限らず Hydrator, Hydration, hydrate という概念があります。 The Hydrator pattern is a variation of the Data Transfer Object design pattern https://www.oreilly.com/library/view/php-7-programming/9781785883446/ch11s02.html ※ 私は2022年の今日、オライリーにこんな解説があるのを知りました。。 これは用語としては、PHPにおいては Doctrine 2 が Java の hibernateを参照して作られたことから、用語として拝借したもので間違いないと思います。 Doc
DjangoRESTFramework (以降 DRF という) を最近良く使っているのですが 設定項目が多すぎて情報探すのに時間がかかっちゃうので、自分なりにまとめてみました。 2月の後半くらいに書いてたんですが、ブログの改修に時間がかかりすぎて公開が遅れたのは内緒。 個人的な感覚ですが、このライブラリの機能を大きく分けると Serializer, View に分かれます。 本当は全部通しで書きたかったんですが、長くなりすぎたので View の部分は別の記事に分割します。 infoビュー については View の使い方をまとめてみた を参照してください。初めて触る方は 先にビュー編を見ることをオススメします。 シリアライザ単体で使うことはまずないと思うので。この記事の先頭に書いてあったインストールの手順とかはそちらの記事に移動しました基本的に情報は v3.7.7 時点の 公式ドキュメント
はじめにこんにちは。divxエンジニアの遠矢です。 私が開発に参画し始めた頃、どこから手を付ければ良いのか分からず悩むことが度々ありました。そんな時、先輩開発者からフロントエンドからバックエンドへのデータフローを教わりました。この流れを理解することで、開発プロジェクトがスムーズに進行しました。この背景から、実際に開発で使用したフロントエンド(jQuery)、バックエンド(Django)を例にして、データフローの流れや、DjangoのSerializerを使用してモデルを橋渡しする方法(Django REST framework)についても記述していきたいと思います。 基本的な概要フロントエンドとバックエンドとは? まず、フロントエンドとバックエンドの基本的な概念と実装範囲について説明します。 フロントエンド(jQuery): ユーザーからの入力やアクションをトリガーとしてデータを収集します
はじめに Railsのプロジェクトで一部json形式でデータをレスポンスを返す必要があった時、インスタンス変数をメソッドで無理やりjsonにして関連付けレコードはmergeで無理やり連結、といった力技でコードを書いていました。 しかし、Active Model Serializerというgemを使えば簡単にjsonデータを整形できるとのことだったので試してみました。 環境 ruby '2.5.1' rails '5.2.4.1' active_model_serializers '0.10.10' 使用するモデル、アソシエーション class Project < ApplicationRecord has_many :jobs, dependent: :destroy has_many :project_categories, dependent: :destroy has_many :c
# Shale Shale is a Ruby object mapper and serializer for JSON, YAML, TOML, CSV and XML. It allows you to parse JSON, YAML, TOML, CSV and XML data and convert it into Ruby data structures, as well as serialize data structures into JSON, YAML, TOML, CSV or XML. # Introduction Working with data serialization formats directly can be painfull. This is especially true for XML. Let's consider this simple
サーバー・クライアント間でデータをやり取りするフォーマットとして XML と JSON が有名所だと思います。 それぞれのフォーマットについて詳しい所はググればいくらでも出てくるので、ここでは述べません。 ただ、XML に比べて JSON が勝っているところを上げておくと… XML よりサイズが小さくなる場合が多い Delphi RTL や .NET といった一部のフレームワークには JSON Serializer が用意されている ということです。 最近、僕が自分でフォーマットを決められる場合は、ほぼ必ず JSON を指定しています。 なぜなら JSON Serializer が便利すぎるから! …で、さっきはググればいくらでも出てくるから述べないと書きましたが、JSON Serializer も同じで色々引っかかります。 では、何故書くのかというと、Qiita には、Delphi の
// Import decorators from library import { JsonObject, JsonProperty } from 'typescript-json-serializer'; // Enums export enum Gender { Female, Male, Other } export enum Status { Alive = 'Alive', Sick = 'Sick', DeadAndAlive = 'Dead and alive', Dead = 'Dead' } // Create a JsonObject class: LivingBeing // JsonObject decorator @JsonObject() export class LivingBeing { /** The living being id (PK) */ @J
Serializer 何をするもの? データに対してシリアライズとデシリアライズを行うところ。 デシリアライズとは? 入力データを元になんらかのオブジェクトを作成すること。 まずは基本の基本からやるとして、こういうモデルがあるとする。 class Book(object): def __init__(self, title, author, price, created=None): self.title = title self.author = author self.price = price self.created = created or datetime.now() class BookSerializer(serializers.Serializer): title = serializers.CharField(max_length=255) author = seria
DjangoのSerializerでいつ何がどう呼ばれてどのmethodをどう実装すればよいかがわからないことがあります。 公式ドキュメントを読んでもいまいちどう実装すればいいかわかないという人(自分も具体的な使い方が想像できませんでした。)も多いと思うのでよく使う以下の3つのメソッド/プロパティについて中のModelSerializerクラスのソースを実際に読みながらまとめてみました。 - save - is_valid - data serializer.save() まずはObject作成時や更新時に呼ぶメソッドの解説をします。 一部省略していますが、saveは以下のように実装されています。 def save(self, **kwargs): # 一部省略 # ① assert hasattr(self, '_errors'), ( 'You must call `.is_valid
前回、Django REST Frameworkを用いてREST APIを作成するという記事を公開しましたが、今回はSerializerクラスの作成を行ってみます。 Serializerクラスを作成することで、Djangoのモデル、データベースを他の形式に変換することができます。今回はJSON形式。 ■Python 今回のPythonのバージョンは、「3.8.5」を使用しています。(Windows10)(pythonランチャーでの確認) ■Serializerクラスの作成Serializerクラスを作成してみますが、前回DjangoRESTFrameworkを用いてREST APIを作成しましたので、開発サーバーを実行し、アプリを実行します。実行後、作成したモデル、データベースにデータを追加します。 今回は「Name:田中」,「Hometown:大阪」,「Age:23」というデータを追加し
ModelViewSetなんかを使用していると、それぞれのアクション毎にserializerを変更したいことが多々あると思います。 日本語情報が少なくてベストプラクティスなのかどうかは疑わしいですが、クラスベースviewの中でserializerを変更する方法をとりあえずメモしておきます。 環境 Python 3.5.2 Django 1.9.7 djangorestframework 3.4.0 方法 get_serializer_classメソッドをオーバーライドし、アクション毎に異なるserializerを返却するようにします。 以下にlistとretrieveで返却するフィールドを変えたserializers.pyとviews.pyの簡単なコード例を示します。 serializers.py class HogeSerializer(serializers.ModelSerializ
class UserSerializer < ActiveModel::Serializer attribute :id attribute :name attribute :email end そのテストコードがこちら ポイントだと思うところはこちらの2つ 1. Serializerのインスタンスを生成する必要がある 2. .to_jsonメソッドのオプションを使用して、返ってくるデータのカラムを指定する必要がある アソシエーションがある場合は、includeオプションを利用するとうまいこと書けると思います。 require 'rails_helper' RSpec.describe "UserSerializer", type: :serializer do context "when create user" do let(:user) { create(:user) } it "m
from rest_framework import serializers from rest_framework.validators import UniqueValidator from django.core.validators import EmailValidator from models.users import Users # serializers.ModelSerializerを継承する class Serial(serializers.ModelSerializer): # UniqueValidatorでUsersモデルに登録したいemailがすでに登録されたかをシリアライズする # EmailValidatorでemailのフォーマットをシリアライズする email = serializers.EmailField(validators=[UniqueVal
RailsのViewでJbuilderを使用していて、collectionのレンダリングが遅いなと感じたことはないでしょうか? その場合、jsonapi-serializer で手軽に改善できるかもしれません。 jsonapi-serializer の詳しい使い方は 公式ドキュメント を見ていただくとして、本記事では Jbuilder を jsonapi-serializer で置換する際のTipsを書きます。 なお完全に置換するのではなく手軽に検証するために Jbuilder と jsonapi-serializer を共存させるハイブリッド形式にしています。(効果が確認でき必要であれば全置換すればいいと思います) おことわり とある事情により本記事を書いており、主に時間の制約により以下の注意点があります。 実際のプロジェクトで以前に対応した内容を基に本記事を書いています。結構速くなった
はじめに django-rest-frameworkのserializerを利用してクライアントからのリクエストに応じて動的にフィールドを変更する場合、 公式ガイドにあるクラスを利用し返すことが出来ます。 ビューセットからの呼び出しサンプルです。 ここではフィールドの動的変更のみを行いますが、他のパラメータと組み合わせることで返却するフィールドを柔軟に変更できるようになります。 Dynamic クラスの定義 公式ガイドにあるクラスを利用します。 https://www.django-rest-framework.org/api-guide/serializers/#dynamically-modifying-fields from rest_framework import serializers class DynamicFieldsModelSerializer(serializers
こんにちは、Djangoアドベントカレンダー9日目の記事です。 自己紹介です。 大学3年生で、普段はメディア処理・情報通信系を専門に勉強しています。 大学2年後期からWeb開発にも興味が湧き、勉強しつつ趣味やインターンにも取り組んできました。 今回は、DjangoにおけるAPI作成のごく一部ですがTipsを投稿することに致しました。 テーマはDjangoRestFrameworkで少し複雑なManyToManyを扱うことです。 対象は、DjangoRestFrameworkを使ったことがありN対Nについて知らないが気になる方々です。 N対Nとは? この記事を見ている時点でご存知の方も多いとは思いますが以下の関係性です。 音楽共有サイトなどがあったとします。 プレイリストA,B,Cというものがあり、楽曲い,ろ,はが存在している状況となります。 同じ楽曲が複数プレイリストに含まれるし、同じプレ
RailsAPIモードで開発をする際に、JSONを整形するためにjsonapi-serializerというものを使用している。 このgemに関してgoogle検索してもほとんど日本語の記事が出てこないため、基本のことではあるがここにメモしておく。 module Api::V1::Admin class CompaniesController < ApplicationController def index companies = User.all json_string = CompanySerializer.new(users) render json: json_string end end end
この作りが良いのかどうかは別にして、SerializerからViewの情報にアクセスしたい時ってありますよね。そんな時に使える便利なMixinを社内では使いまわしています。やればやるほど、ViewとSerializerとの結合が強くなるので、 用法・用量 を守って使うのをオススメします。 何はともあれ、ソースコードです。 ViewAccessSerializerMixin class ViewAccessSerializerMixin(object): def get_view_action(self): """ Serializer から View の actionへアクセスする """ context = getattr(self, 'context') if not context: warnings.warn('serializerにcontextが存在しません。不正な形でインスタ
業務でserializerを使用しているのですが、含めたい情報/含めたくない情報を しっかり管理していかないといけないな、と感じることがあったので書いておきます。 前提:ActiveModelSerialierとは Rails APIにリクエストを送ると、そのアクションで取得したレコードを render jsonを使用してレスポンスに含めることができます。 class Api::V1::UsersController < Api::V1::ApplicationController def show user = User.find(params[:id]) render json: user end end 上記の場合、userの情報をレスポンスに含めることができます。 ただ、これだとuserが保持しているすべてのカラムの情報を返してしまいます。 たとえば、Usersテーブルに下記カラム
きっかけ 最近でいちばんなるほどと思ったこと、検索してもあまり出てこない情報だなと感じたのでまとめる。 出来事 ActiveModelSerializerでJSONを出力する際、Rubyの命名規則でカラム名を書こうとした。 たとえば、ユーザーが自身のアイコン画像があるかのフラグを真偽値で返したいときの命名。 class UserSerializer < ActiveModel::Serializer attributes :id, :name, :registered_avatar def registered_avatar ... end end 最初はavatar_registered?と命名しようとしたが、 他のserializerのコードを見ても語尾に?をつけた命名をしていなかったので、 何でだろうと思いながらも一応空気を読んでregistered_avatarと命名してPRを出し
ActiveModelSerializers(0.10系)のインスタンス生成時に引数を渡してSerializerクラス内で使う方法RubyRailsJSONActiveModelactive_model_serializers 画像は『Rails: ActiveModelSerializersでAPIを作る』より引用 TL; DR ActiveModelSerializersインスタンス生成時に、key: valueで引数を渡すことができる ActiveModelSerializersクラス側で、@instance_optionsのハッシュから値を取り出すことができる 動作環境 Ruby:2.6.1 Rails:5.2.3 ActiveModelSerializers:0.10.10 ActiveModelSerializersが0.10であれば他はそこまで気にしなても良いです 前提 簡易
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く