在Mongoengine中取消引用ReferenceField

时间:2015-06-10 12:07:54

标签: mongodb flask mongoengine objectid dbref

我正在尝试取消引用Flask后端的引用字段,并返回完整对象,并取消引用该字段。

我试图取消引用的字段定义如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">

<include
    android:id="@+id/toolbar_actionbar"
    layout="@layout/toolbar_default"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />


<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/toolbar_actionbar">

    <FrameLayout
        android:id="@+id/main_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/toolbar_actionbar" />

    <!-- android:layout_marginTop="?android:attr/actionBarSize"-->
    <fragment
        android:id="@+id/navigation_drawer"
        android:name="vodafone.navdrawertest.NavigationDrawerFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:layout="@layout/fragment_navigation_drawer" />
</android.support.v4.widget.DrawerLayout>

我试图取消引用它的方式是这样的:

vouches_received = db.ListField(db.ReferenceField('Vouch'))

然而,当我这样做时:

unverified_vouches = []
for vouch in usr.vouches_received:
    unverified_vouches.append(vouch.to_mongo())

usr.vouches_received = unverified_vouches

在对象上,我得到一个ValidationError,如下所示:

usr.to_json()

3个点(...)基本上是解除引用的文档,它主要包含字符串,日期字段和其他一些我不希望取消引用的参考字段。

我知道这是一个有效的错误,因为它期望参考字段的ObjectID,但随后出现了问题,我如何成功取消引用该字段并返回文档。

由于

1 个答案:

答案 0 :(得分:1)

ListField期待ObjectId的元素,并且因为你已经取消引用它们,它会抛出该错误。我不确定这是最优雅的方式,但您可以将usr.to_json()转换为dict,然后将vouches_received列表替换为引用列表 - 我无法测试它但有类似的事情吗?

user_dict = json.loads(usr.to_json())

unverified_vouches = []
for vouch in usr.vouches_received:
    user_dict['vouches_received'].append(vouch.to_mongo())

usr_json = json.dumps(user_dict)

更好的解决方案可能是使用EmbededDocument。