Reputation: 4943
Assume I have these models:
ModelA(models.Model):
some_field_a = models.IntegerField()
ModelB(models.Model):
some_field_b = models.IntegerField()
a = models.ForeignKey(ModelA)
ModelC(models.Model):
some_field_c = models.IntegerField()
b = models.ForeignKey(ModelB)
Then in my serializer for ModelC, I have this to access the field some_field_b from ModelB:
class ModelCSerializer(serializers.ModelSerializer):
field_b = serializers.SlugRelatedField(
read_only=True,
source='some_field_b',
slug_field='some_field_b')
field_a = ???
class Meta:
model = ModelC
fields = ('some_field_c', 'field_b', 'field_a')
But what should I add to field_a to retrieve the value of some_field_a, in the same way I'm retrieving the value from some_field_b?
Upvotes: 3
Views: 1160
Reputation: 4141
Not sure if I understand your example, but it seems you wish to walk the relation from C -> B -> A and get that value. You can follow the relation in the source
argument using dot syntax, much like you would if you were accessing the object directly.
class ModelCSerializer(serializers.ModelSerializer):
field_b = serializers.SlugRelatedField(
read_only=True,
source='b.some_field_b',
slug_field='some_field_b')
field_a = serializers.SlugRelatedField(
read_only=True,
source='b.a.some_field_a',
slug_field='some_field_a')
class Meta:
model = ModelC
fields = ('some_field_c', 'field_b', 'field_a')
Upvotes: 4