Nader
Nader

Reputation: 1148

Django Rest Framework foreign key nesting

I am trying to nest my Users table inside my Relationships table. So instead of this:

[
    {
        "user": 1,
        "related_user": 2,
        "relationship": "followed_by"
    }
]

I am trying to get this:

[
    {
        "user": {
            "username": "user1",
            "name": "User 1",
            "email": "bla",
            "phone": "bla",
            "date_joined": "2017-11-01T21:34:13.101256Z"
         },
        "related_user": {
            "username": "user2",
            "name": "User 2",
            "email": "bla",
            "phone": "bla",
            "date_joined": "2017-11-01T21:34:13.101256Z"
         },
        "relationship": "followed_by"
    }
]

I looked up tutorials and I tried adding serializers.RelatedField , UserSerializer(many=true, read-only=true) etc. but nothing worked

Models.py

class User(models.Model):
    username = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    phone = models.CharField(max_length=255)
    date_joined = models.DateTimeField(auto_now_add=True, blank=True)

    def __str__(self):
        return str(self.pk) + ", " + self.username


RELATIONSHIP_CHOICE = [
    ("follows", "follows"),
    ("followed_by", "followed_by"),
    ("none", "none"),
]

class Relationship(models.Model):
    user = models.ForeignKey(User, related_name="primary_user", null=True)
    related_user = models.ForeignKey(User, related_name="related_user", null=True)
    relationship = models.CharField(max_length=40, choices=RELATIONSHIP_CHOICE, default=RELATIONSHIP_CHOICE[0])

Serializers.py

from rest_framework import serializers
from . import models

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.User
        fields = (
            'username',
            'name',
            'email',
            'phone',
            'date_joined',
        )


class RelationshipSerializer(serializers.ModelSerializer):
    related_user = UserSerializer(many=True)

    class Meta:
        model = models.Relationship
        fields = (
            'user',
            'related_user',
            'relationship',
            'related_user'
        )

I tried to add related user to my serializer but it didnt work. I am getting an error: 'User' object is not iterable

Any help is appreciated.

Upvotes: 3

Views: 1182

Answers (1)

Ykh
Ykh

Reputation: 7717

class RelationshipSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    related_user = UserSerializer(read_only=True)

    class Meta:
        model = models.Relationship
        fields = (
            'user',
            'related_user',
            'relationship'
        )

user = UserSerializer(read_only=True, many=True) is for manytomany field,user = UserSerializer(read_only=True) is for ForeignKey field.

Upvotes: 2

Related Questions