1

というクラスがありTogglePropertyます。これを使用して、オブジェクトの一部のプロパティが切り替えられたかどうかに関する情報を保存します。プロパティの例としては、「いいね」、「ブックマーク」、「フォロー」などがあります。

class ToggleProperty(models.Model):
    # "like", "bookmark", "follow" etc
    property_type = CharField()

    # The user who toggled the property
    user = ForeignKey(User)

    # The object upon which the user is toggling the property, e.g. "user likes image"
    object_id = models.TextField()
    content_type = models.ForeignKey(ContentType)
    content_object = generic.GenericForeignKey('content_type', 'object_id')

ここで、特定の他のユーザーがフォローしているユーザーのリストを取得したいと思います。彼を Tom と呼びましょう。

TogglePropertyユーザーではなく、ToggleProperties が返されるため、単にクエリを実行することはできません。

だから私はこれを行います:

# First get the ContentType for user, we'll need it
user_ct = ContentType.objects.get_for_model(User)

# Now get the users that Tom follows
followed_by_tom = [
    user_ct.get_object_for_this_type(id = x.object_id) for x in   
    ToggleProperty.objects.filter(
        property_type = "follow",
        user = tom,
        content_type = ContentType.objects.get_for_model(User))
]

これの問題は、私の見解ではデータベースにヒットすることであり、私はそれが好きではありません。

これが十分に醜くない場合は、聞いてください。私は実際、Tom がフォローしているユーザーがアップロードした画像に興味があるので、Tom がフォローしているユーザーが作成したすべての画像を Tom に見せることができます。

したがって、上記のコードに次のように追加します。

images = Image.objects.filter(user__in = followed_by_tom)

これにより、最終的に 400 を超えるクエリが実行され、処理に 1 秒以上かかります。もっと良い方法があるに違いないので、道を教えてくれませんか?

4

1 に答える 1