楷模 :
class Store(models.Model):
name = models.CharField(max_length=100)
greatStore = models.BooleanField()
class Book(models.Model):
stores = models.ManyToManyField(Store)
name = models.CharField(max_length=200,unique=True)
fantasticBook = models.BooleanField()
我想得到所有在大商店里的书的清单。阅读文档,它说:https://docs.djangoproject.com/en/dev/topics/db/queries/#spanning-multi-valued-relationships我应该写:
myBooks =Book.objects.filter(stores__greatStore=True)
但这只是与 Store.greatStore==TRUE 进行 JOIN ,这不是我想要的!
例如,如果我有 2 家商店(都是很棒的商店)和我的数据库中属于 2 家商店的一本书,myBooks 将有 2 个元素:同一本书的两倍。
我想要至少有一个大商店的书籍集合,而不是验证的情侣 (b,s) 的第一个元素(s 属于 b.stores 和 s.greatStores==true)
编辑 :
为什么我认为 Django 的 API 具有误导性:让我们保持相同的示例:2 家很棒的商店和属于这两家商店的书 (fantasticBook==true)。如果您运行请求:
myBooks = Book.objects.all()
你只得到一个结果:唯一存在的书。如果您运行请求:
myBooks = Book.objects.filter(coolBook=True)
你只得到一个结果:唯一存在的书。如果您运行请求:
myBooks = Book.objects.filter(stores__greatStore=True)
这似乎意味着您获得了至少有一家很棒的商店的书籍集合,但这不是我们得到的,因为 myBooks 有 2 个结果。