ユーザーが投稿をお気に入りとして設定できるアプリケーションがあります。モデルは次のように定義されます。
class UserProfile(models.Model):
user = models.OneToOneField(User)
favorites = models.ManyToManyField('Post', through='Favorite', related_name='favorited_by')
class Post(models.Model):
created_by = models.ForeignKey(UserProfile)
body = models.TextField()
class Favorite(models.Model):
created_by = models.ForeignKey(UserProfile)
post = models.ForeignKey(Post)
現在、投稿を照会すると同時に、投稿が現在のユーザーによってお気に入りにされているかどうかを確認する簡単な方法を探しています。現在、エレガントとはほど遠い次のソリューションを使用しています。
query = """
SELECT p.id, p.body, p.created_by_id, f.created_by_id AS favorited
FROM main_post p LEFT OUTER JOIN main_favorite f
ON
p.id = f.post_id AND
f.created_by_id = %s
""";
posts = Post.objects.raw(query, [request.user.userprofile.id])
これにより、投稿が現在のユーザーによってお気に入りに登録されていない場合は null 値、投稿がお気に入りに登録されている場合は現在のユーザーの ID を持つ「favorited」という名前の列が作成されます。
djangoのORMを使用して、これをよりシンプルかつエレガントに行うことができる方法はありますか?