Python 使用Django Queryset跨表检查ID
我目前正在尝试统计用户活动,但只会在他们首次注册后两天进行统计。因为我将对数据进行后处理,所以我希望它返回一个Django QuerySet 唯一相关的字段如下所示:Python 使用Django Queryset跨表检查ID,python,django,django-models,Python,Django,Django Models,我目前正在尝试统计用户活动,但只会在他们首次注册后两天进行统计。因为我将对数据进行后处理,所以我希望它返回一个Django QuerySet 唯一相关的字段如下所示: User user_id, install_time Activity user_id, date, [list of activities] 虽然我已经拼凑出了一个解决方案,但效率极低(O(n²)),因为我必须在连续的循环中分别匹配用户ids 目前,ForeignKey字段不适合我的模型。我发现;但是,我找不到一种方法只返回
User
user_id, install_time
Activity
user_id, date, [list of activities]
虽然我已经拼凑出了一个解决方案,但效率极低(O(n²)),因为我必须在连续的循环中分别匹配用户id
s
目前,ForeignKey
字段不适合我的模型。我发现;但是,我找不到一种方法只返回一个QuerySet,其中user\u id
s匹配并且date>install\u time+datetime.timedelta(2)
有什么想法吗
编辑:以下是我的模型:
class User(models.Model):
user_id = models.CharField(max_length=36)
install_time = models.DateTimeField()
class Activity(models.Model):
user_id = models.CharField(max_length=36)
date = models.DateTimeField()
# Misc activity-related fields
如果看不到您的模型,就不可能给您任何明确的方向,但是Django的查询API支持遍历模式
您可能会执行以下操作:
from django.db.models import F
Activity.objects.filter(date__gt=F('user__install_time')+timedelta(2))
更新(基于编辑)
您设置模型的方式效率低下,不允许您利用上述代码。特别是,您应该在活动
上有一个指向用户
的外键
class Activity(models.Model):
user = models.ForeignKey(User)
date = models.DateTimeField()
...
在user
上使用user\u id
可能也不是最佳选择。即使您没有直接指定它(或者更确切地说,因为您没有直接指定它),Django也会自动向模型添加一个id
字段,该字段是表上的主键。所以你的模型实际上是:
在您的模型上同时具有id
和user\u id
是令人困惑的。如果user\u id
与用户名相似,则将其重命名为username
。否则,你可能根本不需要它
最后,奇怪的是,您实际上首先定义了一个User
类。如果您打算使用Django的auth
包进行身份验证和用户管理,您将遇到巨大的问题(这意味着您永远不应该真正定义自己的用户
,以防万一)。如果需要向内置的用户
添加额外字段,可以使用配置文件模型来完成。请参阅:如果不查看您的模型,就不可能为您提供任何明确的方向,但Django的查询API支持遍历模式
您可能会执行以下操作:
from django.db.models import F
Activity.objects.filter(date__gt=F('user__install_time')+timedelta(2))
更新(基于编辑)
您设置模型的方式效率低下,不允许您利用上述代码。特别是,您应该在活动
上有一个指向用户
的外键
class Activity(models.Model):
user = models.ForeignKey(User)
date = models.DateTimeField()
...
在user
上使用user\u id
可能也不是最佳选择。即使您没有直接指定它(或者更确切地说,因为您没有直接指定它),Django也会自动向模型添加一个id
字段,该字段是表上的主键。所以你的模型实际上是:
在您的模型上同时具有id
和user\u id
是令人困惑的。如果user\u id
与用户名相似,则将其重命名为username
。否则,你可能根本不需要它
最后,奇怪的是,您实际上首先定义了一个User
类。如果您打算使用Django的auth
包进行身份验证和用户管理,您将遇到巨大的问题(这意味着您永远不应该真正定义自己的用户
,以防万一)。如果需要向内置的用户
添加额外字段,可以使用配置文件模型来完成。请参阅:由于您的模型没有使用显式联接,因此不能像Chris Pratt建议的那样使用fieldF
对象
如果您无法修改模式,我可以看到另外两个选项仍然利用一些django ORM,但需要编写SQL查询/片段
我假设postgresql并完全猜测django可能来自您所说的命名不正确的模型的db模式
例如:
使用extra
可能会很尴尬,您可以通过str(activity\u set.query)
检查它生成的sql
或者,您也可以使用手工完成整个查询。例如:
activity_set = Activity.objects.raw("""
SELECT
myapp_activity.* from myapp_activity, myapp_user
WHERE
myapp_activity.user_id=myapp_user.user_id
and myapp_activity.date - myapp_user.install_time > '2 days'
""")
由于您的模型没有使用显式联接,因此不能像Chris Pratt建议的那样使用fieldF
对象
如果您无法修改模式,我可以看到另外两个选项仍然利用一些django ORM,但需要编写SQL查询/片段
我假设postgresql并完全猜测django可能来自您所说的命名不正确的模型的db模式
例如:
使用extra
可能会很尴尬,您可以通过str(activity\u set.query)
检查它生成的sql
或者,您也可以使用手工完成整个查询。例如:
activity_set = Activity.objects.raw("""
SELECT
myapp_activity.* from myapp_activity, myapp_user
WHERE
myapp_activity.user_id=myapp_user.user_id
and myapp_activity.date - myapp_user.install_time > '2 days'
""")
您已经问了一个几乎相同的问题:。那太糟糕了@谢谢你指出这一点!我不小心在标记时提交了问题,但是停止了页面重定向,所以我没有意识到我在重复发布。不过,这一个更彻底,所以我删除了另一个问题。为什么将用户ID从一个序列匹配到另一个序列会使其成为n^2?@TillBackhaus我使用的是由.values().annotate(fields)
返回的两个dict列表,所以我必须在存储匹配的dict之前对每个dict进行迭代。不是说这是最好的选择;这只是一个快速解决方案。您已经问了一个几乎相同的问题:。那太糟糕了@谢谢你指出这一点!我不小心在标记时提交了问题,但是停止了页面重定向,所以我没有意识到我在重复发布。不过,这一个更彻底,所以我删除了另一个问题。为什么从一个序列到另一个序列匹配用户ID使其成为n^2?@tilback