今日やること
・ データベースの正規化の理解
・ models:def__str__(self)の理解
#def__str__(self)とは?
まず結論から言うと、
def__str__(self)により、管理画面に表示されるモデル内のデータ(レコード)を判別するための、名前(文字列)を定義することができる。
def__str__(self)がない場合、管理画面の表示から、データを判別することができないため、管理が難しい。
#models.pyでのdef__str__(self)設定方法
models.pyでのdef__str__(self)の設定方法の解説。
models.py内でモデル、フィールをの定義ができたら、そのモデル内に以下のようにdef__str__(self)
を追記する。
class GooglePlace(models.Model):
info = models.JSONField(null=True, blank=True)
place_id = models.CharField(max_length=1000)
latitude = models.FloatField()
longitude = models.FloatField()
def __str__(self):
return self.info['name'] if self.info else self.place_id
ここではGooglePlaceモデル内にinfo, place_id, latitude, longitudeフィールドが設定されており、def str(self)内では、infoフィールドを返すようにしています。
もし、infoフィールドがない場合、place_idフィールドを返すように設定する。(応用)
このreturnで設定するフィールド項目が管理画面でそのデータ(レコード)を判別できるように表示されます。
#管理画面での表示
それでは管理画面でどのように表示されるのか見ていきましょう。
まず__str__(self)がない場合ですが、以下のように表示されるため、Postモデル内のデータを判別することができません。
次に__str__(self)をmodels.pyに追記した画面です。
以下画面表示を見ると、Postモデルのタイトルフィールドが表示されているので、どのデータが何なのか判別が簡単になりました。
こちらの方が断然見やすいですね!
#Serializer
SerializerのなかにSerializerのフィールドを入れる.
次に勉強していくのはSerializerについてです。
以下のようなSeriaizerがある場合、リシアライジングされたクラスを次のようにして変数に格納することができる。
class PostImageSerializer(serializers.ModelSerializer):
class Meta:
model = PostImage
fields = ['id', 'url']
class PostSerializer(serializers.ModelSerializer):
images = PostImageSerializer(source='postimage_set', many=True)
class Meta:
model = Post
fields = ['id', 'user', 'google_place', 'type', 'permalink', 'message', 'ig_id', 'images']
sourceで定義した引数はFieldの引数に指定され、そのFieldに入るシリアライズされたデータの値に属性を指定できます.
#serializers.SerializerMethodField()
次にserializers.SerializerMethodField()
について学んでいく
これはget_xxxとなっているメソッドをコールするフィールドである。
例えば、
class GooglePlaceSerializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField()
class Meta:
model = GooglePlace
fields = ['id', 'info', 'place_id', 'latitude', 'longitude','image']
def get_image(self, obj):
post_image = PostImage.objects.filter(post__google_place=obj).order_by('-id').first()
if not post_image:
return ''
return post_image.url
Serializerのフィールドを動的に決めたい!!
SerializerMethodField がありますが、これは実際に動的に作成したい値を定義するフィールドです。 get_{フィールド名} として定義されているメソッドをコールします。 これらは共に出力専用属性です。
serializers.SerializerMethodField()
を使うことにより,methodの結果によってフィールドの値を決めることができる。