Reputation: 3832
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!
Upvotes: 3
Views: 2130
Reputation: 1352
in version 1.3.1 go to the fields.py file in djongo folder and copy lines 465 & 466 and add these lines after next if.Done
if isinstance(value, dict):
return value
if isinstance(value, ModelSubterfuge):
value = value.subterfuge
if isinstance(value, dict):
return value
Upvotes: 0
Reputation: 3832
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
Upvotes: 2