Python 在django模型中使用请求
我有两个模型Python 在django模型中使用请求,python,django,django-models,Python,Django,Django Models,我有两个模型 class Post(models.Model): user = models.ForeignKey(User, verbose_name='User') content = models.TextField(verbose_name='Text', max_length=4000) date = models.DateTimeField(verbose_name='Date', default=now()) class Vote(models.Model
class Post(models.Model):
user = models.ForeignKey(User, verbose_name='User')
content = models.TextField(verbose_name='Text', max_length=4000)
date = models.DateTimeField(verbose_name='Date', default=now())
class Vote(models.Model):
vote = models.IntegerField(choices=VOTE, verbose_name='Vote')
post = models.ForeignKey(Post, verbose_name='Post')
user = models.ForeignKey(User, verbose_name='User')
和查看加载最后15个帖子的内容:
posts = Post.objects.all().order_by('-date')[:15]
现在,我想在所有queryset对象中获得有关活动用户投票的信息
我考虑过Post模型中的自定义方法,该方法将检查登录用户并获取投票对象:
def user_vote(self):
try:
data = Vote.objects.filter(post=self, user=request.user)
return data.vote
except ObjectDoesNotExist:
#not voted
但django似乎不允许在模型中使用请求。
还有其他想法吗?您可以将用户作为参数传递给如下方法:
def user_vote(self, user):
votes = Vote.objects.filter(post=self, user=request.user)
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
from crequest.middleware import CrequestMiddleware
current_request = CrequestMiddleware.get_request()
另外,我猜您需要获取投票实例,而不是queryset,因此您应该使用用户.get
方法来代替.filter
:
def user_vote(self, user):
try:
data = Vote.objects.get(post=self, user=user)
return data.vote
except ObjectDoesNotExist:
#not voted
然后可以使用Post实例调用此方法:
post.user_vote(request.user)
# Note the request being passed as a parameter
vote = post.user_vote(request)
更新
Django不允许在模板中使用带参数的方法。因此,在您的情况下,最好将此方法重构为templatetag:
def get_user_vote(post, user):
try:
data = Vote.objects.get(post=post, user=user)
return data.vote
except ObjectDoesNotExist:
#not voted
你可以在这里找到手册
别忘了注册:)您可以将user作为参数传递给如下方法:
def user_vote(self, user):
votes = Vote.objects.filter(post=self, user=request.user)
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
from crequest.middleware import CrequestMiddleware
current_request = CrequestMiddleware.get_request()
另外,我猜您需要获取投票实例,而不是queryset,因此您应该使用用户.get
方法来代替.filter
:
def user_vote(self, user):
try:
data = Vote.objects.get(post=self, user=user)
return data.vote
except ObjectDoesNotExist:
#not voted
然后可以使用Post实例调用此方法:
post.user_vote(request.user)
# Note the request being passed as a parameter
vote = post.user_vote(request)
更新
Django不允许在模板中使用带参数的方法。因此,在您的情况下,最好将此方法重构为templatetag:
def get_user_vote(post, user):
try:
data = Vote.objects.get(post=post, user=user)
return data.vote
except ObjectDoesNotExist:
#not voted
你可以在这里找到手册
别忘了注册:)这不是django的问题,因为请求不在代码范围内。若您将请求传递给模型的方法,它将起作用。比如:
def user_vote(self, request):
try:
data = Vote.objects.get(post=self, user=request.user)
return data.vote
except Vote.DoesNotExist:
#not voted
并使用您的Post实例将其称为:
post.user_vote(request.user)
# Note the request being passed as a parameter
vote = post.user_vote(request)
更新:
要获得用户的所有投票,您可以执行以下操作:
def user_vote(self, user):
votes = Vote.objects.filter(post=self, user=request.user)
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
from crequest.middleware import CrequestMiddleware
current_request = CrequestMiddleware.get_request()
我们在末尾设置了一个0,因此如果没有来自该用户的投票,我们将得到一个0作为回报。
这将汇总每一票并返回
如果不想对这些投票进行求和,请更改行:
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
致:
这将为您提供一个包含
请求的所有投票的列表。user
user这不是django的问题,因为请求不在您的代码范围内。若您将请求传递给模型的方法,它将起作用。比如:
def user_vote(self, request):
try:
data = Vote.objects.get(post=self, user=request.user)
return data.vote
except Vote.DoesNotExist:
#not voted
并使用您的Post实例将其称为:
post.user_vote(request.user)
# Note the request being passed as a parameter
vote = post.user_vote(request)
更新:
要获得用户的所有投票,您可以执行以下操作:
def user_vote(self, user):
votes = Vote.objects.filter(post=self, user=request.user)
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
from crequest.middleware import CrequestMiddleware
current_request = CrequestMiddleware.get_request()
我们在末尾设置了一个0,因此如果没有来自该用户的投票,我们将得到一个0作为回报。
这将汇总每一票并返回
如果不想对这些投票进行求和,请更改行:
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
致:
这将为您提供一个包含
请求中所有投票的列表。user
user我想您正在寻找此软件包:
说明:
crequest将从代码中的任何位置为您带来django应用程序的当前请求对象
它是这样使用的:
def user_vote(self, user):
votes = Vote.objects.filter(post=self, user=request.user)
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
from crequest.middleware import CrequestMiddleware
current_request = CrequestMiddleware.get_request()
我想你在找这个包裹: 说明: crequest将从代码中的任何位置为您带来django应用程序的当前请求对象 它是这样使用的:
def user_vote(self, user):
votes = Vote.objects.filter(post=self, user=request.user)
return reduce(lambda x, y: x.vote + y.vote, votes, 0)
from crequest.middleware import CrequestMiddleware
current_request = CrequestMiddleware.get_request()
@dimamobile修复了它。感谢@Patrickbasut和@dimamobile提供了这个有用的提示,但是我需要调用我的用户_vote实例来处理多篇文章(例如最后15篇文章)。我是否应该尝试调用user\u vote并在模板中传递
request
参数?@dimamobile修复了此问题。感谢@patrickbasut和@dimamobile提供此有用提示,但我需要调用我的user\u vote实例来处理多篇文章(例如最后15篇文章)。我是否应该尝试调用user_vote并在模板中传递request
参数?经过长时间的思考,我决定使用@dimamobile的建议创建一个自定义模板标签。无论如何,谢谢大家的帮助。经过长时间的思考,我决定使用@dimamobile的建议创建一个定制的templatetag。无论如何,谢谢大家的帮助。