ModelSerializerでこれを行うことができます:
注:それ'posts.Post'
がモデルであると仮定しますC
class CsSerializer(serializers.ModelSerializer):
class Meta:
model = C
fields = ('name')
class AsSerializer(serializers.ModelSerializer):
post_id = CsSerializer()
class Meta:
model = A
# exclude = ('field_you_dont_want_1', 'field_you_dont_want_2')
# fields = ('field_you_want_1', 'field_you_want_2')
この場合CsSerializer
、モデルから必要なフィールドを返すことができることに注意してください。C
name
文字列だけが必要な場合は、StringRelatedFieldを使用できます
class AsSerializer(serializers.ModelSerializer):
post_id = serializers.StringRelatedField(many=True)
class Meta:
model = A
これStringRelatedField
は、C モデルが method で返すものを返します__unicode__
( __str__
python 3.x の場合は method )。
編集
今、あなたのコメントから、私はそれがモデルで'posts.Post'
はないことを知っています. したがって、 SerializerMethodFieldC
を使用できます。
class AsSerializer(serializers.ModelSerializer):
c_name = serializers.SerializerMethodField()
def get_c_name(self, obj):
return obj.user_id.c_set.values('name') # this will return a list of dicts with B's related C objects.
class Meta:
model = A
編集
モデルではいつでもクラス メソッドを定義できます。
class B(AbstractBaseUser):
email = models.EmailField(unique=True)
username = models.CharField(max_length=20, unique=True)
first_name = models.CharField(max_length=40)
last_name = models.CharField(max_length=40)
# `resource_id`
profile_photo = models.ForeignKey('C', null=True)
def get_profile_photo(self):
return self.profile_photo.name # This will return 'C' related object's name
したがって、A のオブジェクトがある場合:
a_object.user_id.get_profile_photo()
または、B のオブジェクトがある場合:
b_object.get_profile_photo()
編集
C クラスの新しい Serializer を定義できます。
class CsSerializer(serializers.Serializer):
class Meta:
model = C
次に、あなたのAsSerializer
class AsSerializer(serializers.ModelSerializer):
c_name = serializers.SerializerMethodField()
def get_c_name(self, obj):
qs = obj.user_id.c_set.all()
qs_serialized = CsSerializer(qs, many=True)
return qs_serialized.data
class Meta:
model = A