我有一个Realtor
带有 ForeignKey 字段 ( ) 的模型 ( BillingTier
),它有一个 ManyToManyField ( BillingPlan
)。对于每个登录的房地产经纪人,我想检查他们是否有一个计费计划,可以对他们的列表提供自动反馈。简要介绍一下模型的外观:
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()
我认为第二个选项读起来更好,但我认为第一个会执行得更好,因为我不必导入和查询 BillingTier 模型。
有没有更好的选择,或者这两个是我所希望的最好的选择?此外,对于每个页面加载,哪个更有效?