Django Queryset значение динамического поля на основе request.user

У меня есть веб-сервис, который возвращает список ссылок.

{
     [
         {"id":1,"href":"http://website.com","title":"Title1"},
         {"id":2,"href":"http://website.com","title":"Title2"},
         {"id":3,"href":"http://website.com","title":"Title1"}
     ]
}

Теперь я хочу расширить его, чтобы вернуть также поле voted, который скажет мне, если пользователь уже проголосовал за эту ссылку или нет.

{
     [
         {"id":1,"href":"http://website.com","title":"Title1","voted": "True"},
         {"id":2,"href":"http://website.com","title":"Title2","voted": "False"},
         {"id":3,"href":"http://website.com","title":"Title1","voted": "True"},
     ]
}

Каков наилучший способ добиться этого?

Я создал модель метода voted(self), но я не думаю, что это лучшее место для этого, и все же у меня нет доступа к request.user в моем классе моделей.

 links\model.py ----------------------------------------

class Link(models.Model):
    href = models.URLField()
    title = models.CharField(max_length=400)

def voted(self, request):
    vote = UserVotes.objects.get(link_id=self.link.id, user_id=request.user)
    if vote == 1:
        return True
    else:
        return False

--------------------------------------------------------

 votes\model.py ----------------------------------------

class UserVotes(models.Model):
    user = models.ForeignKey(Account, blank=False)
    link = models.ForeignKey(Link, blank=False)
    vote = models.FloatField(null=True, blank=False)

    class Meta(object):
        unique_together = ('user', 'link')

--------------------------------------------------------

 link\serializers.py -----------------------------------

class LinkSerializer(serializers.ModelSerializer):
    voted = serializers.BooleanField()

    class Meta:
        model = Link

        fields = ('id', 'href', 'title','voted')
        read_only_fields = ('id', 'href', 'title', 'voted')

--------------------------------------------------------

1 ответ

Решение

Вы можете добавить только для чтения 'voted'SerializerMethodFieldна ваш сериализатор.

Это добавит ключ voted к сериализованному представлению объекта.

От SerializerMethodField документы:

Его можно использовать для добавления любых данных в сериализованное представление вашего объекта.

Он должен возвращать все, что вы хотите включить в сериализованное представление объекта.

class LinkSerializer(serializers.ModelSerializer):
    voted = serializers.SerializerMethodField(method_name='has_user_voted') # add a 'voted' field

    class Meta:
        model = Link

        fields = ('id', 'href', 'title','voted')
        read_only_fields = ('id', 'href', 'title', 'voted')

    def has_user_voted(self, obj):
        user = self.context['request'].user # get the request object from context
        user_votes = UserVotes.objects.filter(user=user, link=obj)
        if user_votes:
            return True # return True if any user_votes object exists
        return False # otherwise return False
Другие вопросы по тегам