基于request.user的Django Queryset动态字段值
Django Queryset dynamic field value based on request.user
我有一个网络服务 returns links 的列表。
{
[
{"id":1,"href":"http://website.com","title":"Title1"},
{"id":2,"href":"http://website.com","title":"Title2"},
{"id":3,"href":"http://website.com","title":"Title1"}
]
}
现在我想将它扩展到 return 字段 voted
,它会告诉我用户是否已经投票给这个 link。
{
[
{"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 class.
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')
--------------------------------------------------------
您可以将只读 'voted'
SerializerMethodField
添加到序列化程序。
这将向对象的序列化表示添加一个键 voted
。
来自 SerializerMethodField
文档:
It can be used to add any sort of data to the serialized
representation of your object.
It should return whatever you want to be included in the serialized
representation of the object.
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
我有一个网络服务 returns links 的列表。
{
[
{"id":1,"href":"http://website.com","title":"Title1"},
{"id":2,"href":"http://website.com","title":"Title2"},
{"id":3,"href":"http://website.com","title":"Title1"}
]
}
现在我想将它扩展到 return 字段 voted
,它会告诉我用户是否已经投票给这个 link。
{
[
{"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 class.
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')
--------------------------------------------------------
您可以将只读 'voted'
SerializerMethodField
添加到序列化程序。
这将向对象的序列化表示添加一个键 voted
。
来自 SerializerMethodField
文档:
It can be used to add any sort of data to the serialized representation of your object.
It should return whatever you want to be included in the serialized representation of the object.
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