2017-07-09 28 views
0

对于每个问题,都有很多答案。我有一个表格投票,其中包含所有问题和答案的upvote/downvotes。我想执行一个查询是这样的:从投票在Django中执行WHERE'field'IN(list)查询?

选择*其中username = “一些用户名” AND(QID = “问题” OR(AID IN(选择答案AID WHERE QID = “问题”) ))

class Question(models.Model): 
    QID = models.CharField(default="",max_length=5, primary_key=True) 
    title = models.CharField(max_length=30, default="") 
    description = models.CharField(max_length=1055, default="") 
    date = models.DateTimeField(default=datetime.now, blank=True) 
    username = models.CharField(max_length=30, default="") 
    votes = models.IntegerField(default=0) 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title 


class Answer(models.Model): 
    AID = models.CharField(max_length=5, default="", primary_key=True) 
    QID = models.ForeignKey(Question,on_delete=None) 
    description = models.CharField(max_length=1055, default="") 
    date = models.DateTimeField(default=datetime.now, blank=True) 
    username = models.CharField(max_length=30, default="") 
    votes = models.IntegerField(default=0) 
    approved = models.BooleanField(default=False) 

    def __str__(self): 
     return self.AID 

class Vote(models.Model): 
    username = models.ForeignKey(User,on_delete=None) 
    QID = models.ForeignKey(Question,on_delete=None, null=True, blank=True) 
    AID = models.ForeignKey(Answer,on_delete=None, null=True, blank=True) 
    vote = models.BooleanField(default=True) 

    def __str__(self): 
     if self.QID is not None: 
      return self.QID.QID+'_'+self.username.username+'_'+str(self.vote) 
     else: 
      return self.AID.AID+'_'+self.username.username+'_'+str(self.vote) 

PS请注意,QID和AID是外键。所以他们只会采用Question/Answer Model的实例。

回答

1

你可以做,

from django.db.models import Q 

Vote.objects.filter(username='some_username').filter(
         Q(QID=question_id) | 
         Q(AID__QID=question_id 
         ) 

注:完全同意@ schillingt的答案达成一致。

或者,如果你想获得的所有问题的Vote对象,那么你可以称之为反向关系一样,

question = Question.objects.get(QID='some_id') 
question.vote_set.all() 
+0

这部分的意义是什么,'.values_list('AID',flat = True)' –

+0

values_list()返回查询集中对象的字段值列表。 – zaidfazil

0

我认为更好的方式来做到这一点是:

from django.db.models import Q 

Vote.objects.filter(username='some_username').filter(
    Q(QID=question_id) | 
    Q(AID___QID=question_id) 
) 

它避免了Fazil Zaid的答案中的附加查询,该附加查询需要通过在单个查询中获取给定问题ID的Answer ID。