过滤没有值的数据集

filter dataset not having a value

假设我有如下架构:

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

这很简单 SQL 使用 group bynot having 子句,我遇到困难的是使用 django 查询集和注释来完成它。大多数注释都是围绕 count 工作的,我无法适应这种特殊情况。

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

这应该可以满足您的要求:

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

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

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

不过我觉得您的 Books 模型有点奇怪。不确定您的具体用例是什么,但似乎与 Author 具有 ManyToMany 关系的 Book 模型可能更合适。