Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.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 使用Django Queryset跨表检查ID_Python_Django_Django Models - Fatal编程技术网

Python 使用Django Queryset跨表检查ID

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字段不适合我的模型。我发现;但是,我找不到一种方法只返回

我目前正在尝试统计用户活动,但只会在他们首次注册后两天进行统计。因为我将对数据进行后处理,所以我希望它返回一个Django QuerySet

唯一相关的字段如下所示:

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建议的那样使用field
F
对象

如果您无法修改模式,我可以看到另外两个选项仍然利用一些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建议的那样使用field
F
对象

如果您无法修改模式,我可以看到另外两个选项仍然利用一些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