【问题标题】:Perform WHERE 'field' IN (list) query in Django?在 Django 中执行 WHERE 'field' IN (list) 查询?
【发布时间】:2017-07-11 00:38:03
【问题描述】:

每个问题都有很多答案。我有一张投票表,其中包含对所有问题和答案的赞成/反对票。我想执行如下查询:

从投票中选择 * WHERE username="some username" AND (QID="question" OR (AID IN (SELECT AID from Answers WHERE QID="question")))

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)

附:请注意,QID 和 AID 是外键。所以他们只会采用问题/答案模型的实例。

【问题讨论】:

    标签: mysql django


    【解决方案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()
    

    【讨论】:

    • 这部分有什么意义,.values_list('AID', flat=True)
    • values_list() 返回查询集中对象的字段值列表。
    【解决方案2】:

    我认为更好的方法是:

    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 的答案 id 所需的额外查询。

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 2012-09-25
      • 2011-10-02
      • 1970-01-01
      • 2011-01-21
      • 2016-01-13
      • 2014-09-23
      • 1970-01-01
      相关资源
      最近更新 更多