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