2016-08-02 9 views
3

ジャンゴ・静止枠組みの中で、一般的な関係をシリアル化。私はserializer relationsのドキュメンテーションページを見つけてコードをたどった。 TaggedItemSerializer内部TaggedObjectRelatedField(への入力がどうあるべきか今私はジャンゴ・休憩・フレームワークでGenericRelationsを使用する方法を学習しようとしています

class BookmarkSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Bookmark 
     fields = ('url', 'link_url',) 


class NoteSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Note 
     fields = ('url', 'text',) 


class TaggedObjectRelatedField(serializers.RelatedField): 
    """ 
    A custom field to use for the 'tagged_object' generic relationship 
    """ 

    def to_representation(self, value): 
     """ 
     Serialize tagged objects to their respective serializer formats 
     :param value: 
     :return: 
      serializer.data 
     """ 
     if isinstance(value, Bookmark): 
      return 'Bookmark: ' + value.url 
     elif isinstance(value, Note): 
      return 'Note: ' + value.text 
     raise Exception('Unexpected type of tagged object') 


class TaggedItemSerializer(serializers.ModelSerializer): 
    tagged_object = TaggedObjectRelatedField() 
    class Meta: 
     model = TaggedItem 
     fields = ('url', 'id', 'tag_name', 'tagged_object') 

: 私はモデルを作成しました:

class TaggedItem(models.Model): 
    """ 
    Tags arbitary model instance using a generic relation. 

    """ 
    tag_name = models.SlugField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    tagged_object = GenericForeignKey('content_type', 'object_id') 

    def __unicode__(self): 
     return self.tag_name 

class Bookmark(models.Model): 
    """ 
    A bookmark consists of a URL, and 0 or more descriptive tags. 
    """ 
    link_url = models.URLField() 
    tags = GenericRelation(TaggedItem) 

class Note(models.Model): 
    """ 
    A note consists of some texts, and 0 or more descriptive tags 
    """ 
    text = models.CharField(max_length=1000) 
    tags = GenericRelation(TaggedItem) 

私はシリアライザを作成しましたか?

class TaggedItemSerializer(serializers.ModelSerializer): 
    tagged_object = TaggedObjectRelatedField(read_only=True) 

助けてください: は現在、私は私があまりにもREAD_ONLY = Trueのとして引数を与えてみましたが、それは私が正確に何をしたか置くために同じerror.justを投げた

File "/home/aswin/Documents/WebProjects/drf_practice/uni_auth//loginpage/login/serializers.py", line 76, in TaggedItemSerializer 
    tagged_object = TaggedObjectRelatedField() 
    File "/home/aswin/Documents/WebProjects/drf_practice/uni_auth/lib/python3.5/site-packages/rest_framework/relations.py", line 80, in __init__ 
    'Relational field must provide a `queryset` argument, ' 
AssertionError: Relational field must provide a `queryset` argument, override `get_queryset`, or set read_only=`True`. 

としてエラーを取得しています私あなたがTaggedItemをシリアライズしたくない理由、この

答えて

2

で私は、あなたがTaggedItemをシリアル化についてを参照してください。記事には何も見ていないのですか?

from models import Bookmark, Note, TaggedItem 
from rest_framework import serializers 


class TaggedObjectRelatedField(serializers.RelatedField): 
    def to_representation(self, value): 
     if isinstance(value, Bookmark): 
      serializer = BookMarkSerializer(value) 
     elif isinstance(value, Note): 
      serializer = NoteSerializer(value) 
     else: 
      raise Exception('Unexpected type of tagged object') 

     return serializer.data 


class BookMarkSerializer(serializers.HyperlinkedModelSerializer): 
    tags = TaggedObjectRelatedField(many=True, queryset=TaggedItem.objects.all()) 

    class Meta: 
     model = Bookmark 
     fields = ('pk', 'url', 'tags') 


class NoteSerializer(serializers.HyperlinkedModelSerializer): 
    tags = TaggedObjectRelatedField(many=True, queryset=TaggedItem.objects.all()) 

    class Meta: 
     model = Note 
     fields = ('pk', 'text', 'tags') 
+0

このコードスニペットは間違いなくDRFドキュメントにありません:

は、ここに私のシリアライザクラスです。物事をもっとはっきりさせるだろう。 – cbo

+0

しかし、なぜ、「TaggedItemをシリアル化したくないのですか?私はジェネリックモデルをシリアライズするのは完全に有効なアプローチだと思います。これはどうすればできますか? – cbo

関連する問題