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 返回模型尚未加载