【问题标题】:MongoEngine: difference between EmbeddedDocumentListField() and ListField(EmbeddedDocumentField())?MongoEngine:EmbeddedDocumentListField() 和 ListField(EmbeddedDocumentField()) 之间的区别?
【发布时间】:2018-05-02 11:29:29
【问题描述】:

标题。这两个语句是做同样的事情,还是我在这里遗漏了什么?

cars = db.EmbeddedDocumentListField(Car, default= [])

cars = db.ListField(db.EmbeddedDocumentField(Car), default=[])

【问题讨论】:

    标签: python mongoengine


    【解决方案1】:

    EmbeddedDocumentListField 支持对返回的嵌入文档列表进行查询操作,如 count()、filter()、delete()、create()。因此,使用 EmbeddedDocumentListField() 而不是 List(EmbeddedDocumentField()) 会更有益。

    更多细节和方法列表参考:

    http://docs.mongoengine.org/apireference.html#embedded-document-querying

    == 编辑:更多细节 ==

    这是一个使用 EmbeddedDocumentListField 方法的示例,展示了如何将 EmbeddedDocument 添加到主文档模型下 2 层的 EmbeddedDocumentListField:

    model1_obj.model2_list.get(model2_id_field=model2_id).model3_list.create(**model3_data)
    

    model1_obj.model2_list.filter(model2_id_field=model2_id).first().model3_list.create(**model3_data)
    

    这里是与此代码sn-p相关的模型和视图类:

    models.py:

    from mongoengine import *
    
    class Model3(EmbeddedDocument):
        field1 = StringField()
        field2 = StringField()
        field3 = StringField()
    
    class Model2(EmbeddedDocument):
        # other fields
        model2_id_field = # Some field
        model3_list = EmbeddedDocumentListField(Model3)
    
    class Model1(Document):
        # other fields
        model2_list = EmbeddedDocumentListField(Model2)
    

    views.py:(使用Django rest框架实现patch方法)

    class Model1AddModel3(APIView):
        def get_object(self, id):
            return Model1.objects.get(pk=id)
    
        def patch(self, request, id, format=None):
            model1_obj = self.get_object(id)
            #
            # Validate request.data here
            # Extract model2 identifier and model3 data from request.data
            # e.g.:
            # model2_id = request.data['model2id']
            # model3_data = {'field1': 'a', 'field2': 'a', 'field3': 'a', }
            #
            model1_obj.model2_list.get(model2_id_field=model2_id).model3_list.create(**model3_data)
            #
            # You can also use:
            # model1_obj.model2_list.filter(model2_id_field=model2_id).first().model3_list.create(**model3_data)
            #
            model1_obj.save()
            return Response(some_data, status=status.HTTP_201_CREATED)
    

    【讨论】:

      猜你喜欢
      • 2019-04-22
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      相关资源
      最近更新 更多