1

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

模型.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)

视图.py:

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

我想:
[<Offer: Test1>]

但我得到:
[<Offer: Test1>, <Offer: Test1>, <Offer: Test1>]

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

4

3 回答 3

1

由于您要在 3 个表上进行连接。它会为您返回该城市所有商店的报价结果。尝试这样做

Offer.objects.all().filter(shop__city=1).distinct()
于 2013-01-03T19:51:01.420 回答
1

来自Django 文档

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

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

print Offer.objects.all().filter(shop__city=1).distinct()
于 2013-01-03T19:51:57.947 回答
0

试试这个,

 Offer.objects.filter(shop__city__id = 1).distinct()
于 2013-01-03T19:45:46.243 回答