Djongo неправильно получает встроенные поля Object Array с помощью Django-rest-framework - PullRequest
2 голосов
/ 22 марта 2019

У меня проблемы с отображением массива кодов в виде встроенного поля в Django.

  • Я подключаю Django к MongoDB, где есть встроенные документы.(См. Ниже) MongoDB
  • Добавление полей в Django Administration работает нормально.(См. Ниже)

    Django_Admin

  • Однако в Django Rest Framework он не отображается как встроенное поле
    .

Django_Rest_Framework Frontend

Вот мой код для 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
    )

Спасибо!

1 Ответ

1 голос
/ 23 марта 2019

После небольшого исследования я нашел ответ на https://github.com/nesdis/djongo/issues/115.

Я изменил serializers.py, чтобы проверить EmbeddedModelFields или ArrayModelFields:

def get_codes проверяет, есть лиПоле представляет собой модель EmbeddedModelField или ArrayModelField.Если так, то разместите поле.

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

Django_rest_framework

...