Django中的ORM对ManyToMany字段的奇怪行为

时间:2013-01-03 19:38:10

标签: django orm

我尝试使用Offers选择City中可用的所有id=1,但我得到X倍的结果倍数,其中X是Shops的数量city_id=1 1}}:

models.py:

class Cities(models.Model):    
    name = models.CharField(max_length=128)
    slug = models.SlugField(unique=True)

class Shop(models.Model):    
    name = models.CharField(max_length=128)
    city = models.ManyToManyField(to=Cities)

class Product(models.Model):    
    title = models.CharField(max_length=128)

class Offer(models.Model):    
    product = models.ForeignKey(to=Product)
    shop = models.ManyToManyField(to=Shop)

views.py:

print Offer.objects.all().filter(shop__city=1)

我想:
[<Offer: Test1>]

但我明白了:
[<Offer: Test1>, <Offer: Test1>, <Offer: Test1>]

我的数据库中有1条Offer条记录和3条Shop条记录(同城)。
你能告诉我对ManyToMany关系/请求的理解吗?

1 个答案:

答案 0 :(得分:1)

来自Django Docs

  

默认情况下,QuerySet不会消除重复的行。实际上,这很少是一个问题,因为像Blog.objects.all()这样的简单查询不会引入重复结果行的可能性。但是,如果您的查询跨越多个表,则在评估QuerySet时可能会获得重复的结果。那就是你使用distinct()。

您需要应用distinct()方法,因此您可能需要执行以下操作:

print Offer.objects.all().filter(shop__city=1).distinct()