stockersky
stockersky

Reputation: 1571

Django DRF follow relationships

Well, I am trying to follow relationships with Django Rest Framework.

Here is a simplified model :

class Model1(models.Model):
    name = models.CharField(max_length=20)
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Model2(models.Model):
    title = models.CharField(max_length=12, null=True, blank=True)
    model1 = models.ForeignKey(Model1, on_delete=models.CASCADE)

And Serializers :

class Model1Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model1
        fields = '__all__'

class Model2Serializer(serializers.ModelSerializer):
    class Meta:
        model = Model2
        fields = '__all__'

From Model2, I would like to access owner properties, like email...

Without DRF and in a standard template, I would do this :

{{ instanceOfModel2.model1.owner.email }}

This would follow the relationship.

Do you have any idea how could I achieve this using Django DRF?

I looked at https://www.django-rest-framework.org/api-guide/relations/ But what I want is the opposite way... And I'd like to not expose the Django User model through a REST API....

Upvotes: 1

Views: 748

Answers (3)

Jose Garcia
Jose Garcia

Reputation: 9

If you want the field to be read only :

class Model2Serializer(serializers.ModelSerializer): email = serializers.SerializerMethodField() class Meta: model = Model2 fields = ('email', ...) def get_email(self, obj): return obj.model1.owner.email

Upvotes: 0

Umut Gunebakan
Umut Gunebakan

Reputation: 401

You must create a User Serializer and relate the serializers with each other.

User = get_user_model()

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class Model1Serializer(serializers.ModelSerializer):
    owner = UserSerializer()
    class Meta:
        model = Model1
        fields = '__all__'

class Model2Serializer(serializers.ModelSerializer):
    model1 = Model1Serializer()
    class Meta:
        model = Model2
        fields = '__all__'

Upvotes: 0

slider
slider

Reputation: 12990

You can define new fields along with the source attribute using dotted notation:

class Model2Serializer(serializers.ModelSerializer):
    email = serializers.EmailField(source='model1.owner.email', read_only=True)

    class Meta:
        model = Model2
        fields = '__all__'

Upvotes: 6

Related Questions