0

Django values() is very handy, is it possible to serialize nested object too?

class Book(model.Models):
   name = models.CharField(max_length=50)
   user = models.ForeignKey(settings.AUTH_USER_MODEL)

I would hope to do something like

d = Book.objects.all().values('name', 'user', deep={
    'user': ['username', 'first_name', 'last_name'] # related user fields
})

And to get a result

[
 {
  'name': 'book1',
  'user': {'username': 'user1', 'first_name': '...', 'last_name': '..'}
 }
]

So I'll get a nested dict for the foreign key object (user), instead of just the user id. I don't need more than a depth of 1, so only one level of related objects.

Machavity
  • 30,841
  • 27
  • 92
  • 100
user3599803
  • 6,435
  • 17
  • 69
  • 130
  • Django built-in serializers don't support related fields but there are some alternatives available: https://stackoverflow.com/questions/17032362/django-serializing-queryset-with-related-entity-fields/17032984#17032984 – Maxim Kukhtenkov Feb 27 '18 at 17:02

1 Answers1

1

I would suggest Django RestFrameWork for efficient use. Define your serializers.py as below,

from rest_framework.serializers import ModelSerializer


class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('username', 'first_name', 'last_name')


class BookSerializer(ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = Book
        fields = ('name', 'user')


and try this in your view/shell

book = Book.objects.get(id=1)
result = BookSerializer(book).data


OR

all_book_objects = Book.objects.all()
result = BookSerializer(all_book_objects, many=True).data
JPG
  • 82,442
  • 19
  • 127
  • 206