【问题标题】:Django Queryset dynamic field value based on request.userDjango Queryset 基于 request.user 的动态字段值
【发布时间】:2015-11-25 10:37:36
【问题描述】:

我有一个返回链接列表的网络服务。

{
     [
         {"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')

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

【问题讨论】:

    标签: django django-models django-views django-queryset django-managers


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 2018-10-09
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 2014-11-27
      相关资源
      最近更新 更多