Django使用“或”

时间:2015-12-15 14:27:51

标签: python django django-models django-queryset

以下是我的模型(非常复杂,我用字母来简化):

class W(models.Model):
    content = models.CharField(max_length=50)
    is_important = models.BooleanField(default=False, blank=False)

class Se(models.Model):
    ws = models.ManyToManyField(W)

class Ra(models.Model):
    ses = models.ManyToManyField(Se)

class Pq(models.Model):
    ras = models.ForeignKey(Ra)

class PqSe(models.Model):
    pq = models.ForeignKey(Pq)
    se = models.ForeignKey(Phrase)

class PqSeW(models.Model):
    pq_se = models.ForeignKey(PqSe)
    w = models.ForeignKey(W)
    idx = models.IntegerField(blank=False)

class Person(models.Model):
    user = models.ForeignKey(User)

class PersonPqSeW(models.Model):
    pq_se_w = models.ForeignKey('PqSeW')
    is_valid = models.BooleanField(default=False, blank=False)

对于给定的Pq ,我需要的是,以包含所有Se

  • W重要(is_important=True)而不是PersonPqSeW
  • W重要(is_important=True)和PersonPqSeW,但无效(is_valid=False)。

1 个答案:

答案 0 :(得分:1)

你可以试试这个:

from django.db.models import Q

se_qs = Se.objects\
    .filter(pqse__pq=pq, ws__is_important=True)\
    .exclude(Q(pqse__pqsew__personpqsew__is_valid=False) | 
             Q(pqse__pqsew__personpqsew__isnull=False))

基本上,他们的想法是排除不相关的记录。 复杂性在于查询嵌套关系。有关详细信息,请参阅documentation here

另外,如果您想让它更具可读性,我建议您考虑使用related_name for Foreign Keys

此外,有关Q objects

的相关文档