私は、外部キーテーブルに基づいて基本的な「お気に入り」システムを実装しようとしています。ブール注釈により重複が発生しましたか?
のは、私は、次の単純なモデルを持っているとしましょう:
class Item(models.Model)
id = models.IntegerField()
class User(models.Model)
id = models.IntegerField()
class UserFavourites(models.Model)
user = models.ForeignKey(User, related_name='user_for_fav_rel')
item = models.ForeignKey(Item, related_name='item_for_fav_rel')
は、今私は、彼らは、ユーザーがお気に入りとしてマークされているかどうかを確認する項目について、次のクエリセットを生成します。
queryset = Item.objects.all()
USER_ID = request.user.id
queryset = queryset.annotate(
favourite=Case(
When(
item_for_fav_rel__user__id=USER_ID,
then=Value('True')
),
default=Value('False'),
output_field=BooleanField()
)
)
すべてこの作品の偉大な作品ですが、応答では、アイテムが実際に寄付されている場合、私はその特定のアイテムの複製をクエリーセットに受け取ります。どのようにこれを避けるためのアイデア?
結果として得られるSQLクエリ(私が考える最低限の例にダウンし、編集...)
SELECT
"core_item"."id",
CASE
WHEN "core_userfavourites"."user_id" = 1 THEN True
ELSE False
END AS "favourite"
FROM "core_item"
LEFT OUTER JOIN "core_userfavourites"
ON ("core_item"."id" = "core_userfavourites"."item_id")
生成するSQLクエリは何ですか? –
質問の編集を見る... – Eric
'all()'と 'annotate()'を使う特別な理由はありますか? – scharette