Python 在Django的一个视图中访问两个应用程序

Python 在Django的一个视图中访问两个应用程序,python,django,django-models,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) desc

我有一个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') 
class CustomUser(AbstractUser):
    points = models.IntegerField(default=1000)
第二个应用程序,
user/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') 
class CustomUser(AbstractUser):
    points = models.IntegerField(default=1000)
我想做的是这样的:单击特定市场模板上的一个按钮,代码将循环通过该市场中持有股票的所有用户,从他们的总积分中添加/减去他们持有的每一份股票的价值(当用户持有负股时,就会发生减法,这意味着他们因卖空而欠股)。此时每股的价值只是当前市场价格

以下是我目前在
markets/views.py
中看到的内容(最后的
HttpResponseRedirect
只需重新加载页面):

这样做的一个问题(可能还有其他问题)是,目标用户最终的形式是
,这意味着Django抛出错误
CustomUser匹配查询不存在

任何建议都将不胜感激

根据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))
def解析(请求,主键):
market=market.objects.get(pk=pk)
market\u users=Share.objects.all()
打印(市场用户)#提供“”
对于市场中的用户\用户。迭代器():
打印(用户)#给出“10”
如果user.market==pk:
target\u user=CustomUser.objects.get(username=user)
target_user.points+=market.current_price*user.share
目标用户。保存()
market.open=False
市场储蓄
返回HttpResponseRedirect('/'+str(pk))

你做错的是在
共享
对象中访问
用户
的方式

从django.shortcuts导入get\u object\u或\u 404
def解析(请求,主键):
#如果没有此pk的市场,则会引发404
市场=获取对象或404(市场,主键=主键)
#获得特定市场的股票
shares=Share.objects.filter(market\u id=pk)。选择\u related('user'))
打印(共享)#给出“”
对于股份中的股份:
target\u user=CustomUser.objects.get(pk=share.user.pk)
target_user.points+=market.current_price*share.share
目标用户。保存()
market.open=False
市场储蓄
返回HttpResponseRedirect('/'+str(pk))

您可以使用反向(如

)来代替硬编码URL,这是因为您使用的是返回字典的
.values('user')
。您可以使用普通的查询集并循环
qs.iterator()
关于性能。感谢@HigorRossato!请参阅帖子中的编辑。如果我误解了你的建议,请告诉我。这是正确的。结果如何?@HigorRossato,请参阅对帖子的进一步编辑:问题似乎是查询集提供了共享,而不是用户。我尝试循环/迭代的当然是后者,以便我可以查找m在Share和CustomUser模型之间进行匹配,以便更新后者中的用户积分。谢谢你,Higor!问题在于“市场”不是CustomUser的功能(只有积分是)恐怕这会导致一个错误:“CustomUser”对象没有“market”属性抱歉,我的错。我也做了一些更改/编辑。请尝试一下,看看是否有效。这就成功了!非常感谢您的帮助,@HigorRossato!我真的很感激。