2016-06-21 18 views
0

私は2つのモデル(LikeとNews)を持っています。私はdjango-rest-frameworkを使ってWeb APIを作成しています。django rest frameworkはカスタムオブジェクトを返します

モデル:2つのモデルの

class Like(models.Model): 
    user = models.ForeignKey(User) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 
    pub_date = models.DateTimeField(default=timezone.now) 

class News(models.Model): 
    user = models.ForeignKey(User) 
    title = models.CharField(max_length=150) 
    ... 
    likes = GenericRelation(Like) 

シリアライザ:

class LikeObjectRelatedField(serializers.RelatedField): 
    def to_representation(self, value): 
     if isinstance(value, User): 
      return 'User: ' + value.username 
     elif isinstance(value, News): 
      return 'News: ' + value.title 
     ... 
     raise Exception('Unexpected type of tagged object') 

class LikeSerializer(serializers.ModelSerializer): 
    user = UserSerializer() 
    content_object = LikeObjectRelatedField(read_only=True) 

    class Meta: 
     model = Like 
     field = ('user', 'content_object', 'pub_date') 

class NewsSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer() 
    likes = LikeSerializer(many=True) 

    class Meta: 
     model = News 
     fields = ('user', 'title', 'body', 'article_image', 'pub_date', 'likes') 

ビュー:

class NewsViewSet(viewsets.ModelViewSet): 
    queryset = News.objects.all().order_by('-pub_date') 
    serializer_class = NewsSerializer 

これでは私はJSONオブジェクトを取得します。しかし、Newsオブジェクトの場合、ニュースアイテムの好きな数だけが必要で、そのアイテムのお気に入りリストにrequest.userが存在するかどうかをチェックします。代わりに、私はすべてのユーザ(およびユーザ情報)を返却しており、コンテンツオブジェクト、再びユーザなどを好む。

NewsSerializerでLikeを使用するためのカスタムフィールドを作成すると、好きな人のしかし、私はrequest.userがLikesリストにあるかどうか確認できません。

class LikeRelatedField(serializers.RelatedField): 
    def to_representation(self, value): 
     return value.count() 

Newsオブジェクトの好きな数だけを取得するにはどうすればよいですか。また、request.userがその好きなリストに含まれているかどうかを確認し、のブール値を追加するか、NewsオブジェクトごとにFalseを追加しますか?

答えて

0

カスタムフィールドの代わりにSerializerMethodFieldを使用する必要があります。この方法でシリアライザ方式でrequestからself.context['request']にアクセスし、Likeモデルのすべての計算を行います。

関連する問題