gpt4 book ai didi

python - 在 Django 的一个 View 中访问两个应用程序

转载 作者:行者123 更新时间:2023-12-01 07:33:57 25 4
gpt4 key购买 nike

我有一个包含两个应用程序的 Django 项目。第一个,market/models.py ,包括市场类别和股票类别,后者跟踪在任何给定市场上买卖的所有股票,如下所示:

class Market(models.Model):
title = models.CharField(max_length=50, default="")
current_price = models.DecimalField(max_digits=5, decimal_places=2)
description = models.TextField(default="")
shares_yes = models.IntegerField(default=0)
shares_no = models.IntegerField(default=0)
b = models.IntegerField(default=100)
cost_function = models.IntegerField(default=0)
open = models.BooleanField(default=True)

def __str__(self):
return self.title[:50]

def get_absolute_url(self):
return reverse('market_detail', args=[str(self.id)])

class Share(models.Model):
user = models.ForeignKey('users.CustomUser',
on_delete=models.CASCADE,
related_name='user_shares',
default=None)
market = models.ForeignKey(
Market,
on_delete=models.CASCADE,
related_name='market_shares',
default=None)
share = models.IntegerField(default=0)

def __str__(self):
return str(self.share)

def get_absolute_url(self):
return reverse('market_list')

第二个应用程序,user/models.py ,就是创建自定义用户,如下:

class CustomUser(AbstractUser):
points = models.IntegerField(default=1000)

我想做的是这样的:点击特定市场模板上的按钮时,代码将循环遍历该市场中拥有股票的所有用户,以添加/减去每个用户的值(value)从总积分中扣除其拥有的份额(当用户拥有负份额时,会发生减去,这意味着他们因卖空而欠股)。此时每股的值(value)就是当前的市场价格。

这是我目前在 markets/views.py 中所拥有的内容(最后的 HttpResponseRedirect 只是重新加载页面):

def resolve(request, pk):
market = Market.objects.get(pk=pk)
market_users = Share.objects.values('user')
for user in market_users:
target_user = CustomUser.objects.get(username=user)
target_user.points += market.current_price * int(user.share)
market.open = False
market.save()
return HttpResponseRedirect('/' + str(pk))

其中一个问题(可能还有其他问题)是 target_user 最终的形式为 <QuerySet [{'user': 1}, {'user': 1}]> ,这意味着 Django 抛出错误 CustomUser matching query does not exist .

如有任何建议,我们将不胜感激!

按照 Higor 在评论中的建议进行更新:

我尝试了这个,它不会引发错误,但无法更新用户积分:

def resolve(request, pk):
market = Market.objects.get(pk=pk)
market_users = Share.objects.all()
print(market_users) # gives "<QuerySet [<Share: 10>, <Share: 10>]>"
for user in market_users.iterator():
print(user) # gives "10 10"
if user.market == pk:
target_user = CustomUser.objects.get(username=user)
target_user.points += market.current_price * user.share
target_user.save()
market.open = False
market.save()
return HttpResponseRedirect('/' + str(pk))

最佳答案

您做错的是您在 Share 对象中访问 user 的方式。

from django.shortcuts import get_object_or_404


def resolve(request, pk):
# if no Market with this pk raises a 404
market = get_object_or_404(Market, pk=pk)
# get shares for the specific market
shares = Share.objects.filter(market_id=pk).select_related('user')
print(shares) # gives "<QuerySet [<Share: 10>, <Share: 10>]>"
for share in shares:
target_user = CustomUser.objects.get(pk=share.user.pk)
target_user.points += market.current_price * share.share
target_user.save()
market.open = False
market.save()
return HttpResponseRedirect('/' + str(pk))

您可以使用反向,而不是对 URL 进行硬编码,如 here

关于python - 在 Django 的一个 View 中访问两个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57089346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com