为反向通用关系创建Serialiser

时间:2015-09-02 12:56:40

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

在我下面显示的Page Serialisers PageSerializer中,我想从Collection和中获取Generic关系 显示嵌套在PageSerializer中的所有Collection Items(多对多)。

我想要实现类似的输出......

"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 但它只是描述了相反的关系。

2 个答案:

答案 0 :(得分:2)

在您的网页模型上创建GenericRelation,例如:

@using(Html.BeginOptionalWrap("strong", Model.IsUnread, new { @class="someClass" })){
    <a href="viewDocument">
        View Document
    </a>
}

然后使用你的嵌套序列化器......

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" ) ,这将作为例外工作。

答案 1 :(得分:0)

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

{
   "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)
相关问题