1

filterを使用してDjangoでクエリを実行していますrangefilter主キーでグループ化されたクエリセットを常に返すと思っていましたが、そうではないようです。

これらは私のモデルです:

class MCode(models.Model):
    code = models.CharField(max_length=16)
class Product(models.Model):
    id = models.CharField(max_length=40, primary_key=True, db_index=True)
    mcode = models.ForeignKey(MCode, null=True, blank=True, db_index=True)
class Review(models.Model):
    review_id = models.CharField(max_length=32, primary_key=True, db_index=True) 
    product = models.ForeignKey(Product, db_index=True) 
    rating = models.IntegerField() 
    time = models.DateTimeField(db_index=True) 

そしてこれは私のコードです:

mcode = 'M83'
base = Product.objects
tcode_obj = MCode.objects.filter(code=mcode.upper())
return base.filter(tcode=tcode_obj, 
                   review__time__range=[date_from, date_to])

5つの結果が得られましたが、そのうちの3つは同じ主キーを持っています。reviewそれぞれではなく、それぞれの結果を取得しているようですproduct

productsこれらをIDでグループ化し、添付されたカウントで注釈を付ける方法を誰かが知っていますreviewsか?

4

1 に答える 1

1

ある範囲の時間内のsなど、複数回一致する可能性のあるものに基づいて選択すると、すでにそこにあるアイテムの複製であっても、各一致がクエリセットに追加されProductます。Review実際には、この動作が必要になる場合がありますが、クエリセットを一意のアイテムのみに制限する必要がある場合.distinct()は、クエリの最後に使用してください。クエリで論理ORを使用する場合も、重複を取得することがよくあります。そのため、重複を行う場合に注意し、.distinct()そこでも使用することを忘れないでください。

于 2012-07-23T17:14:57.653 に答える