Djongo 没有使用 Django-rest-framework 正确获取对象数组嵌入字段

Posted

技术标签:

【中文标题】Djongo 没有使用 Django-rest-framework 正确获取对象数组嵌入字段【英文标题】:Djongo not obtaining Object Array embedded fields correctly with Django-rest-framework 【发布时间】:2019-08-13 13:59:26 【问题描述】:

我在 Django 上将代码数组显示为嵌入字段时遇到问题。

我将 Django 连接到嵌入了 MongoDB 的 文件。 (见下文)

在 Django 管理中添加字段可以正常工作。 (见下文)

但是,在 Django Rest Framework 上,它并未将其显示为 嵌入字段。

这是我的 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】:

经过一番研究,我在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

【讨论】:

【参考方案2】:

在 1.3.1 版本中,转到 djongo 文件夹中的 fields.py 文件并复制第 465 和 466 行并在下一个 if.Done 之后添加这些行

if isinstance(value, dict):
        return value
    
if isinstance(value, ModelSubterfuge):
        value = value.subterfuge

if isinstance(value, dict):
        return value

【讨论】:

以上是关于Djongo 没有使用 Django-rest-framework 正确获取对象数组嵌入字段的主要内容,如果未能解决你的问题,请参考以下文章

将 Djongo (Mongo ORM) 与 CosmosDB 一起使用?

django mongodb 使用 djongo 和 pymongo 连接

Django 与 Djongo,EmbeddedFields 返回模型尚未加载

Djongo重新定义了ArrayModelField的结构

尝试重置密码时出现 Djongo + Django + MongoDB Atlas DatabaseError

Djongo:EmbeddedField 的不支持查找 <field> 或不允许加入该字段