1

ManyToManyField ( ) を持つRealtorForeignKey フィールド ( ) を持つモデル ( ) があります。ログインしている不動産業者ごとに、リスティングに自動フィードバックを提供する料金プランがあるかどうかを確認したいと思います。モデルは次のようになります。BillingTierBillingPlan

class Realtor(models.Model):
  user = models.OneToOneField(User)
  billing_tier = models.ForeignKey(BillingTier, blank=True, null=True, default=None)

class BillingTier(models.Model):
  plans = models.ManyToManyField(BillingPlan)

class BillingPlan(models.Model):
  automatic_feedback = models.BooleanField(default=False)

各ページの読み込み時にユーザーのアクセス許可をチェックし、特定のページへのアクセスを拒否するアクセス許可ヘルパーがあります。料金プランに自動フィードバック機能がない場合、フィードバック ページを拒否したいです。ただし、この情報を取得する最善の方法はよくわかりません。これまでに調査して見つけたものは次のとおりですが、ページの読み込みごとにクエリを実行するのは非効率的です。

def isPermitted(user, url):
  premium = [t[0] for t in user.realtor.billing_tier.plans.values_list('automatic_feedback') if t[0]]

filter( queryset の ManyToMany フィールド値)を使用するいくつかのソリューションを見ましたが、ページの読み込みごとにクエリを使用することについても同様に確信が持てません。不動産業者から請求層 ID を取得する必要があります。bt_id = user.realtor.billing_tier.id次に、次のようにモデルにクエリを実行します。

BillingTier.objects.filter(id = bt_id).filter(plans__automatic_feedback=True).distinct()

2 番目のオプションの方が読みやすいと思いますが、BillingTier モデルをインポートしてクエリを実行する必要がないため、最初のオプションの方がパフォーマンスが良いと思います。

より良いオプションはありますか、それともこれらの 2 つが私が期待できる最高のものですか? また、ページの読み込みごとにどちらがより効率的でしょうか?

4

1 に答える 1