过滤器数据集没有值

时间:2017-10-20 05:16:40

标签: django django-queryset django-annotate

假设我有如下的架构:

Book | Author
-------------
 B1  |   A1
 B1  |   A3
 B1  |   A2

 B2  |   A5 
 B2  |   A4
 B2  |   A3

 B3  |   A5
 B3  |   A6
 B3  |   A1

 B4  |   A1
 B4  |   A5
 B4  |   A6

以下型号:

class Books(models.Model):
    author = models.CharField(
        max_length=100,
        blank=False,
        null=False,
        db_index=True,
        verbose_name=_('authors'),
    )
    book = models.CharField(
        max_length=50,
        blank=False,
        null=False,
        db_index=True,
        verbose_name=_('book'),
    )

    book_type = models.CharField(
        max_length=50,
        blank=False,
        null=False,
        default="regular"
    )

    flavour = models.CharField(
        max_length=10,
        blank=False,
        null=False,
        verbose_name=_('flavour'),
    )
    cost = models.IntegerField()
    status = models.CharField(
        max_length=100,
        null=True,
        blank=True,
        db_index=True,
    )

我希望过滤掉所有那些作者 A1(本例中 B2 )的书

这是使用group bynot having子句的简单SQL,我正在艰难的时间是使用django queryset和annotate完成它。大多数注释都围绕count工作,我无法适应这种特殊情况。

任何指针都有帮助,谢谢! :)

1 个答案:

答案 0 :(得分:1)

这应该做你想要的:

Books.objects.exclude(author='A1')

如果您想要一个明确的book值列表,那么您可以这样做:

Books.objects.exclude(author='A1').values_list('book').distinct()

你的Books模型对我来说有点奇怪。不确定您的具体用例是什么,但似乎Book模型与ManyToMany的{​​{1}}关系似乎更合适。