3

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.

1 Answer 1

2
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.

Sign up to request clarification or add additional context in comments.

2 Comments

Works great! I was wondering how I can make certain fields appear so for example I don't want to show the users email. How can I do that
the simplest and most efficient way as i know way is replace UserSerializer with UserWithoutEmailSerializer

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.