Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有效地将自定义字段添加到查询集_Python_Django_Django Models_Django Database - Fatal编程技术网

Python 有效地将自定义字段添加到查询集

Python 有效地将自定义字段添加到查询集,python,django,django-models,django-database,Python,Django,Django Models,Django Database,我有一个Django活动网站。在使用django工具栏检查优化机会时,我发现活动订阅列表的视图效率非常低。它对每个订阅发出五个数据库请求,只是为了检查用户是否是成员 我的模型结构如下: class Subscription(models.Model): user = models.ForeignKey(User, null=True) activity = models.ForeignKey(Activity) class MemberProfile(models

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

我的模型结构如下:

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\u中的
WorkYear
字段中
current
设置为true

我在
Subscription
中有一个名为
is\u 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,并且没有给出响应


有没有更好更简单的方法?如果没有,我做错了什么?

您是否尝试过
活动、订阅、设置、筛选(user\u memberprofile\u member\u in\u\u current=True)
?但我会在DB模式中引入一些冗余,只是为了消除这些连接。这不是我想要做的。我需要所有订阅,包括非成员用户的订阅。对于每个订阅,我需要一个额外的字段
是\u member
。为什么不在git中添加另一个多余的字段以除去所有这些连接?这是一个好主意,但是我应该为MemberProfile编写一个自定义保存方法,然后如果成员设置已更改,则编辑属于该用户的所有订阅。如果没有其他解决方案,我将使用此方法。谢谢你的主意,我还没想过呢。