的Django从模型字段获取值

问题描述:

我有模式:的Django从模型字段获取值

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?

任何人都可以帮助我吗?

+0

为什么你得到“列表索引超出范围”:因为你的查询集没有返回结果 – Anentropic 2014-12-19 06:02:59

+0

“如果用户没有登录或没有普遍使用,如果他们投票说用户对象没有属性is_general_user”...是的,显然 – Anentropic 2014-12-19 06:03:36

几件事情来优化:中

代替

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现在是一个已授权的人员,他也在db中。

,你可以写你的查询还这样简洁的方法:

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

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

.order_by('-id')[0] 

代替[0][0]

更新:我没有进入你真正想要的内容。我只是试图修复这些bug。

+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 )' – Anentropic 2014-12-19 06:42:59

+0

@Antropic哦是啊你是对的.. – doniyor 2014-12-19 06:46:41

+1

thanx男人,帮助我... – gamer 2014-12-19 11:28:37