I am having trouble displaying the codes array as an embedded field on Django.
I am connecting Django up to a MongoDB where there are embedded
documents. (See below) 
Adding the fields in Django Administration works fine. (See below)

However, on the Django Rest Framework it is not showing it as an
embedded field.

Here is my code for Django models.py
from djongo import models
from django import forms
class Order(models.Model):
code = models.CharField(max_length=3, blank=False, null=False)
quantity = models.IntegerField()
def __str__(self):
return '%s %s' % (self.code, self.quantity)
class OrderForm(forms.ModelForm):
class Meta:
model = Order
fields = (
'code', 'quantity'
)
class Portfolio(models.Model):
username = models.CharField(
primary_key=True, max_length=65, default="", blank=False, null=False)
codes = models.ArrayModelField(
model_container=Order,
model_form_class=OrderForm
)
Thank you!
After a bit of research, I found the answer on https://github.com/nesdis/djongo/issues/115.
I altered serializers.py to check for EmbeddedModelFields or ArrayModelFields:
The def get_codes checks to see if the field is an EmbeddedModelField or ArrayModelField model. If so, then accommodate the field.
from rest_framework import serializers
from portfolio.models import Portfolio
class PortfolioSerializer(serializers.ModelSerializer):
codes = serializers.SerializerMethodField()
class Meta:
model = Portfolio
fields = ('username', 'codes')
def get_codes(self, obj):
return_data = None
if type(obj.codes) == list:
embedded_list = []
for item in obj.codes:
embedded_dict = item.__dict__
for key in list(embedded_dict.keys()):
if key.startswith('_'):
embedded_dict.pop(key)
embedded_list.append(embedded_dict)
return_data = embedded_list
else:
embedded_dict = obj.embedded_field
for key in list(embedded_dict.keys()):
if key.startswith('_'):
embedded_dict.pop(key)
return_data = embedded_dict
return return_data

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With