繁体   English   中英

如何在 django views.py 中运行 forloop?

[英]how to run a forloop in django views.py?

我想对查询集进行交互,如果添加了新用户,我想为特定用户添加一些点。 为了更清楚地了解我正在构建的内容:=> 我正在 django 中编写推荐系统逻辑。 推荐系统现在工作正常,但我想要实现的是这个。 当我推荐一个用户是“用户 2 ”和“用户 3 ”时,存储了我已经推荐了两个用户,现在我还实现了一种方法来知道“用户 2”或“用户 3”是由我:获得了他们推荐的新用户(“用户 2”或“用户 3”)。

现在我想要实现的是,当有来自“用户 2”“用户 3”的新用户时,我想向引用两个用户(“用户 2 ”和“用户 2”“用户 1”添加一些点推荐新用户的用户 3 ")

我正在考虑使用 forloop 来迭代second_level_recommended ,然后将该点添加到配置文件中,但它似乎不起作用,或者我编写的代码可能是错误的。 这是我为下面的 fooloop 编写的代码

# for i in second_level_recommended:
    profile = Profile.objects.filter(recommended_by=request.user)
    profile.indirect_sign_up = profile.indirect_sign_up =+ 200
        

这是检查“ user 2 ”和“ user 3 ”已引用属于“user 1” views.py 的新用户的代码

my_recomended = Profile.objects.filter(recommended_by=request.user).values_list('user__id', flat=True)
second_level_recommended=Profile.objects.filter(recommended_by__in=my_recomended)

然后模板中有一个forloop来显示second_level_recommended

注意:有一个Profile model,其中包含这些字段

class Profile(models.Model):
    user = models.OneToOneField(User, ...)
    ...
    code = models.CharField(max_lenght=100, ...)
    recommended_by = models.ForeignKey(User, ...)

如果不查看代码的更多上下文,很难判断这是否正是您想要的,但我会尝试回答......

我们将使用这种技术而不是 for 循环: https://docs.djangoproject.com/en/4.0/ref/models/expressions/#f-expressions

(另见https://docs.djangoproject.com/en/4.0/ref/models/instances/#updating-attributes-based-on-existing-fields

from django.db.models import F


my_recomended = Profile.objects.filter(recommended_by=request.user).values_list('user__id', flat=True)
second_level_recommended=Profile.objects.filter(recommended_by__in=my_recomended)

second_level_recommended.update(indirect_sign_up=F('indirect_sign_up') + 200)

这意味着我们可以在单个数据库操作中更新second_level_recommended所有匹配的用户。

否则,如果您使用 for 循环,它可能会更慢,但更重要的是,您会冒“竞争条件”的风险。

The race condition would be where you fetch the db row into memory, as a Django model instance, update value on the model instance based on the value just fetched, then save it back to the db. 因此,您可能会遇到一个问题,即有人同时为同一或相关用户请求相同的视图 - 两个请求都获得相同的旧值并添加 200,但两个请求的最终结果只是 +200 而不是 +400 .

使用update查询可以避免这种情况,因为该操作在数据库中是“原子的”——我们告诉数据库将 200 添加到每一行,而不是在 Python 代码中自己一个一个地进行。 如果两个请求几乎同时出现,数据库将确保它们连续执行,所以第一个 +200,然后第二个 +200。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM