高效地向查询添加自定义字段

2024-04-24 02:37:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Django网站的活动。在使用django工具栏检查优化机会时,我发现活动订阅列表的视图效率非常低。它对每个订阅请求5个数据库,只是为了检查用户是否是成员。你知道吗

我的模型结构如下:

class Subscription(models.Model):
    user = models.ForeignKey(User, null=True)       
    activity = models.ForeignKey(Activity)

class MemberProfile(models.Model):
    user = models.ForeignKey(User)
    member_in = models.ManyToManyField(WorkYear, blank=True, null=True)

class WorkYear(models.Model):
    year = models.SmallIntegerField(unique=True)
    current = models.BooleanField(default=False, blank=True)

现在,要检查订阅的用户是否是成员,我们必须检查是否有一个MemberProfile引用它,在它的member_in字段中有一个WorkYear,并且current设置为true。你知道吗

我在Subscription中有一个名为is_member的属性,它返回了这个信息。在模板中,每个订阅都会调用此属性,从而导致大量的数据库请求。 我不想这样做,而是想在视图中创建的QuerySet中添加一个自定义字段。你知道吗

我已经试验过extra()函数:

subscriptions = activity.subscription_set.extra(
        select={
            'is_member': 'SELECT current FROM activities_subscription LEFT OUTER JOIN (auth_user LEFT OUTER JOIN (members_memberprofile LEFT OUTER JOIN (members_memberprofile_member_in LEFT OUTER JOIN site_main_workyear ON members_memberprofile_member_in.workyear_id = site_main_workyear.id AND site_main_workyear.current = 1) ON members_memberprofile.id = members_memberprofile_member_in.memberprofile_id) ON auth_user.id = members_memberprofile.user_id) ON activities_subscription.user_id = auth_user.id'
        },
        tables=['site_main_workyear', 'members_memberprofile_member_in', 'members_memberprofile', 'auth_user']
    ).order_by('id')

这真的很复杂,因为某些原因它不起作用。重新加载页面后,Python占用100%的CPU,并且没有给出响应。你知道吗

有没有更好更简单的方法?如果不是,我做错了什么?你知道吗


Tags: inauthidtruemodelssitecurrentleft