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。无论如何,谢谢大家的帮助。