0

楷模 :

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 个结果。

4

1 回答 1

1

您可以使用distinct()它将为您提供独特的结果,Book例如:

myBooks =Book.objects.filter(stores__greatStore=True).distinct()
于 2012-09-14T15:22:26.017 回答