Python django的多对多不清楚
型号:Python django的多对多不清楚,python,database,django,Python,Database,Django,型号: 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) fantasticBo
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()
我想弄一份大书店里所有书的目录。阅读文档时,它说:我应该写:
myBooks =Book.objects.filter(stores__greatStore=True)
但是这仅仅是一个与商店的连接。greatStore==TRUE这不是我想要的
例如,如果我有两个商店(都是很棒的商店),数据库中有一本书属于这两个商店,那么myBooks将有两个元素:两倍于同一本书
我想要的是至少有一个大商店的藏书,而不是验证(s属于b.stores和s.greatStores==true)的夫妇(b,s)的第一个元素
编辑:
为什么我认为Django的API具有误导性:
让我们举一个相同的例子:两个很棒的商店和一本属于这两个商店的书(fantasticBook==true)。
如果运行请求,请执行以下操作:
myBooks = Book.objects.all()
myBooks = Book.objects.filter(coolBook=True)
你只会得到一个结果:唯一存在的书。
如果运行请求,请执行以下操作:
myBooks = Book.objects.all()
myBooks = Book.objects.filter(coolBook=True)
你只会得到一个结果:唯一存在的书。
如果运行请求,请执行以下操作:
myBooks = Book.objects.filter(stores__greatStore=True)
这似乎意味着你得到的藏书至少有一个很棒的商店,但这不是我们得到的,因为myBooks有两个结果。你可以使用distinct()
myBooks =Book.objects.filter(stores__greatStore=True).distinct()
那么你希望这些书在结果集中是唯一的吗?我希望这些书的集合至少有一个伟大的商店,所以是唯一的。好吧,似乎就是这样,只是文档不清楚,至少对我来说是这样。