【问题标题】:Creating a Serialiser for a Reverse Generic Relationship为反向泛型关系创建序列化程序
【发布时间】:2015-09-02 12:56:40
【问题描述】:

在我的页面序列化器PageSerializer 中,如下所示,我想从 Collection 和 显示嵌套在 PageSerializer 中的所有集合项(多对多)。

我想实现这样的输出......

"results": [
        {
            "url": "http://127.0.0.1:8000/v1/page/00c8015e-9b03...",
            "title": "Test Page",
            "collections":
                {
                    "title": "Test Collection",
                    [
                     {
                       "image": "http://www.demo.com/test.png",
                       "video": None
                     },
                      {
                       "image": None,
                       "video": "http://www.demo.com/test.mpeg"
                     }
                    ]
                }

        }
    ]
}

这就是我现在拥有的......

class Page(models.Model):
    title = models.CharField(max_length=80)


class PageSerializer(serializers.ModelSerializer):

    class Meta:
        model = Page
        fields = ("title", )



class Collection(models.Model):
    title = models.CharField(max_length=80, help_text="Title of collection")
    content_type = models.ForeignKey(ContentType)
    object_id = models.UUIDField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    collection_items = models.ManyToManyField('collections.CollectionItem')


class CollectionItem(models.Model):

    image = models.ImageField(upload_to='/test')
    video = models.URLField(max_length=512, blank=True, null=True)

因为通用关系在集合模型上如何在 DRF 中完成?

我正在考虑在 Page 模型本身上创建一个方法来获取数据并将其添加到序列化程序中。

我确信有更好的方法。我看过http://www.django-rest-framework.org/api-guide/relations/#generic-relationships 但它只描述了以相反的方式建立关系。

【问题讨论】:

    标签: python django python-3.x django-models django-rest-framework


    【解决方案1】:

    例如在您的页面模型上创建一个GenericRelation

    class Page(models.Model):
         title = models.CharField(max_length=80)
         stuff = GenericRelation('app_name_model_here')
    

    然后像这样使用您的嵌套序列化程序...

    class PageSerializer(serializers.ModelSerializer):
        stuff = YOURColltionserializer(many=True)
        class Meta:
            model = Page
            fields = ("title", "stuff" )
    

    一旦你定义了你的YOURColltionserializer,这将作为例外工作。

    【讨论】:

      【解决方案2】:

      首先,你的JSON是不正确的,propher方式是这样的:

      {
         "results":[
            {
               "url":"http://127.0.0.1:8000/v1/page/00c8015e-9b03...",
               "title":"Test Page",
               "collections":{
                  "title":"Test Collection",
                  "collection_items":[
                     {
                        "image":"http://www.demo.com/test.png",
                        "video":null
                     },
                     {
                        "image":null,
                        "video":"http://www.demo.com/test.mpeg"
                     }
                  ]
               }
            }
         ]
      }
      

      要实现这一点,您应该像这样定义序列化程序:

      class CollectionItemSerializer(serializers.ModelSerializer):
          class Meta:
             model = CollectionItem
             fields = ['image', 'video']
      
      class CollectionSerializer(serializers.ModelSerializer):
          collection_items = CollectionItemSerializer(many=True, read_only=True)
          class Meta:
             model = Collection
             fields = ['title', 'collection_items']
      
      class PageSerializer(serializers.Serializer):
          title = serializes.CharField(max_length=200)
          url = serializers.SerializerMethodField()
          collections = CollectionSerializer(many=true, read_only=True)
      
          def get_url(self, obj):
              return self.context.request.path_info
      
      class ResultSerializer(serializers.Serializer):
          result = PageSerializer(read_only=True)
      

      那么在你看来:

      page = Page.objects.get(...)
      collections = Collection.objects.filter(...)
      result = {
          'title': page.title, 
          'collections':collections
      }
      
      serializer = ResultSerializer(
         {'result':result},
          context={'request': request}
      }
      return Response(serializer.data)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多