0

У меня есть веб-сервис, который возвращает список ссылок.Значение динамического поля 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 
+0

Спасибо, что работает :) –

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