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

标签 python django django-models

我有一个包含两个应用程序的 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/

相关文章:

python - 在 countvectorizer() 中找不到 get_feature_names

python - Pandas 数据框绘图

python - 如何使用 Python boto3 从 AWS DynamoDB 表中获取特定属性的所有项目?

mysql - 是否可以使用 django 模型将数组存储在 mysql 数据库中?

python - 在 Django 中使用 Pillow 压缩图像

python - 我怎样才能写一个没有重复的列表,只有 for,if 和 boolean

django - 如何以守护进程模式运行 Django 服务器?

mysql - 具有许多连接的复杂查询

django - 是否有经过批准的方法可以完全删除应用程序?

python - 在 Django 子类中而不是在基类中强制执行唯一的外键