1

注:私はdjangoとデータベースの両方に不慣れなので、無知を許してください。

django でフォーラムを実装しようとしていて、スティッキー スレッドが必要です。私が考えていた単純な方法は、スレッド モデルを次のように定義することでした。

class Thread(models.Model):
    title = models.CharField(max_length=max_title_length)
    author = models.ForeignKey(Player, related_name="nonsticky_threads")
    post_date = models.DateField()
    parent = models.ForeignKey(Subsection, related_name="nonsticky_threads")
    closed = models.BooleanField()
    sticky = models.BooleanField()

スティッキー スレッドを取得するには、次のようにします。

sticky_threads = Thread.objects.all().filter(sticky=True)

問題は、少なくとも理論的には、これには O(n) の複雑さがあり、悪いように聞こえることです。(スティッキー スレッドは常に最初のページに表示されるため、このクエリはかなり頻繁に実行されます)。

私の現在の代替手段は、個別の Thread クラスと Sticky_Thread クラスも作成することです。

class Thread(models.Model):
    title = models.CharField(max_length=max_title_length)
    author = models.ForeignKey(Player, related_name="nonsticky_threads")
    post_date = models.DateField()
    parent = models.ForeignKey(Subsection, related_name="nonsticky_threads")
    closed = models.BooleanField()
class Sticky_Thread(models.Model):
    title = models.CharField(max_length=max_title_length)
    author = models.ForeignKey(Player, related_name="sticky_threads")
    post_date = models.DateField()
    parent = models.ForeignKey(Subsection, related_name="sticky_threads")
    closed = models.BooleanField()

何があっても、スティッキー スレッドを O(1) 時間で取得できます。このアプローチの気に入らない点は、プレーヤーのスレッドをすべて取得したい場合、次のような特別なスレッド プロパティを実装する必要があることです。

class Player(models.Model):
    [snip]

    @property
    def threads(self):
        return self.sticky_threads | self.nonsticky_threads

そして、このアプローチは醜く感じます。

このようなものを実装するための明らかに最良の方法はありますか? 単純な方法が受け入れられるかどうかを確認するためにタイミングを行う必要がありますか? (私はこれを学習課題として実装しているので、厳密な制限はありません。このチェックを少し難しくしています) (もしそうなら、どのようにすすめますか?より良い代替手段はありますか?

ありがとう!

4

1 に答える 1