2016-06-21 7 views
0

У меня есть две модели (Like and News). Я использую django-rest-framework для создания веб-api из него.django rest framework вернуть пользовательский объект

Модели:

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, я могу получить номер . Но я не могу проверить, находится ли request.user в списке Likes.

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

Что мне нужно сделать, чтобы получить только количество понравившихся объектов новостей. Также проверьте, находится ли список request.user в этом списке и может добавить логическое значение user_in_likes:True или False для каждого объекта новостей?

ответ

0

Вместо пользовательского поля вы должны использовать SerializerMethodField. Таким образом, вы можете получить доступ к request через self.context['request'] в методе сериализации и выполнить все вычисления вашей модели Like.

Смежные вопросы