【问题标题】:django get values from a model fielddjango 从模型字段中获取值
【发布时间】:2014-12-19 05:46:14
【问题描述】:

我有模特:

class Question(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=120)
    description = models.TextField()
    category = models.ForeignKey('Category')
    answers = models.ManyToManyField('Answer',related_name='answer_name', blank=True)
    post_date = models.DateTimeField(auto_now=True)
    published = models.BooleanField(default=False)
    vote = models.IntegerField(default=0) # Field that denotes the no of vote for particular question

    def __unicode__(self):
        return self.title

我的看法:

def VoteCountView(request, pk):

    ques = Question.objects.get(id=pk)
    cpk = ques.category.id
    valid_user = ques.user.username

    if request.user.is_general_user:
        if request.user.username == valid_user:
            messages.warning(request, "You cannot vote your own question")
            return redirect("question-detail", pk, cpk)
        else:
            vote_limit = Question.objects.values_list("vote", flat=True).filter(pk=pk).filter(user=request.user)#[0][0]
            print "vote count"
            print vote_limit
            if vote_limit < 1:
                vote_count = ques
                print vote_count.user
                count = vote_count.vote
                count +=1
                vote_count.vote = count
                vote_count.user = request.user
                print vote_count.user
                vote_count.save()
            else:
                messages.warning(request,"You cannot vote twice")
                return redirect("question-detail", pk, cpk)
    else:
        messages.warning(request,"You are not allowed to vote a question")
        return redirect("question-detail", pk, cpk)

我想要的是除了发布问题的用户之外的其他用户可以投票。当其他用户对该问题进行投票时,它会显示列表索引超出范围。我可以从这个模型中实现这一点,还是我必须制作单独的模型进行投票。

另外如果用户没有登录或者不是一般使用,如果投票它说用户对象没有属性is_general_user??

谁能帮我解决这个问题???

【问题讨论】:

  • 为什么你得到“列表索引超出范围”:因为你的查询集没有返回结果
  • "如果用户未登录或不常用,如果他们投票表示用户对象没有属性 is_general_user" ...是的,显然

标签: python django model views


【解决方案1】:

有几点需要优化:

而不是

ques = Question.objects.get(id=pk)

最好使用get_object_or_404(Question, id=pk)。你永远不知道未来会发生什么……

在您执行if request.user.is_general_user: 之前,您需要检查用户是否已通过身份验证:

if request.user.is_authenticated():
    if request.user.is_general_user: 
        #....

这样,您可以确保您使用的是经过身份验证的用户而不是匿名用户(未登录的用户)。这可能会解决您的另一个list index out of range 问题,因为现在您的过滤器中的request.user 是经过身份验证的,也在数据库中。

您也可以用这种更简洁的方式编写查询:

vote_limit = request.user.question_set.values_list("vote", flat=True).filter(pk=pk)#[0][0]

我不知道[0][0]是什么意思,如果想得到最新的问题,你可以这样做:

.order_by('-id')[0]

而不是[0][0]

更新:我没有深入了解您真正想要的内容。我只是试图修复错误。

【讨论】:

  • request.user.question_set.values_list("vote", flat=True).filter(pk=pk) 是对 OP 编码内容的一个很好的翻译……但在 OP 试图实现的上下文中这样做是没有意义的。 (ques = Question.objects.get(id=pk) 之前已经检索到该特定项目)...我认为 OP 真正想要的是基于 Question.objects.exclude(user=request.user)
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 2016-08-11
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多