1

django を使用して最大サイズのリストを実装しようとしています。たとえば、次のようなモデルがあります。

class RecentView(models.Model):
    member = models.ForeignKey(Member)
    product = models.ForeignKey(Product)
    view_time = models.DateTimeField(auto_now=True, auto_now_add=True)
    class Meta:
        unique_together = ('member', 'product')

基本的に、メンバーが最近閲覧した製品のリストを保持しています。各メンバーのレコード数を X 以内に制限したいと考えています。つまり、メンバーが表示した最新の X 個の製品のみを保持します。したがって、新しい挿入中に、そのメンバーに既に X レコードがある場合、そのメンバーの合計レコード数 = X を維持するために、最新のエントリが最も古いエントリを上書きする必要があります。私の見解では、現在、クエリを実行して最初にレコード数:

num_views = RecentView.objects.filter(member_id=<some_mid>).count()

そして、私はロジックを続けます:

if num_views >= X:
    # Do not call create(), but instead issue another query to grab the oldest record and then update it
    ....
else:
    view = RecentView.objects.create(member_id=<some_mid>, product_id=<some_pid>)

この関数はアトミックではないため、このコードが同時に呼び出されると失敗します。個々のレコードをロックしていないため、データベースロックを使用してこれを行う方法がわかりません.テーブル全体をロックすると、個々のメンバーにのみ影響するため、不必要に無駄になるようです.

私にとってこれは一般的な状況のはずですが、何らかの理由で同様の問題を抱えている人を見つけることができませんでした. 誰かがこれをどのように解決するかについて正しい方向に向けることができますか?

ありがとう!ジョン

4

0 に答える 0