1

withでOffers利用可能なすべてを選択しようとしましたが、代わりに X 回の倍数の結果が得られます。ここで、X はwithの数です。Cityid=1Shopscity_id=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)

ビュー.py:

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

私が欲しい:
[<Offer: Test1>]

しかし、私は得る:
[<Offer: Test1>, <Offer: Test1>, <Offer: Test1>]

データベースには 1 つのOfferレコードと 3 つのレコード (同じ都市) がありました。 ManyToMany 関係/リクエストについて、私が間違っていると理解していることを教えていただけますか?Shop

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 に答える