簡體   English   中英

Django - 在 for 循環中注釋 - 我的兩個代碼有什么區別

[英]Django - Annotate within for loop - what is the difference between my two codes

我試圖用values()annotate()總結視圖中的兩列。

第 1 列 第 2 欄
5個 0
5個 -2

當前調用“總計”將返回每行的總計而不是總計。

在模板中返回

5
3

代替

8

我相信這是因為我在 for 循環中打印了總數。 讓我感到困惑的是,我有一個幾乎相似的代碼在另一個視圖中工作得很好。

我怎樣才能得到幾行的總數?

更新以回答 Willem 的問題 - 時間戳用於在創建對象時對 model 個對象的列表進行排序。

這不是我最初寫代碼時想要的結果。 但意識到我可以使用此視圖在創建對象時呈現對象的報告,因此我添加了時間戳以從最近的對象開始對對象進行排序。

這與我的問題無關。 我刪除它以避免混淆。 非常遺憾。

觀點

def function(request, userprofile_id):
venue = UserProfile.objects.filter(user=request.user).values('venue')
points_cummulated_per_user_per_venue = Itemised_Loyalty_Card.objects.filter(user=userprofile_id).filter(venue=request.user.userprofile.venue).values('venue__name','timestamp').annotate(sum_points=Sum('add_points')).annotate(less_points=Sum('use_points')).annotate(total=F('add_points')-F('use_points')).
return render(request,"main/account/venue_loyalty_card.html",{'venue':venue,'points_cummulated_per_user_per_venue':points_cummulated_per_user_per_venue})

模板

{%for model in points_cummulated_per_user_per_venue %}
Total: {{model.total}}
{%endfor%}

楷模

class Itemised_Loyalty_Card(models.Model):
    user = models.ForeignKey(UserProfile, blank=True, null=True, on_delete=models.CASCADE)
    venue = models.ForeignKey(Venue, blank=True, null=True, on_delete=models.CASCADE)
    add_points = models.IntegerField(name = 'add_points', null = True, blank=True, default=0)
    use_points = models.IntegerField(name= 'use_points', null = True, blank=True, default=0)

class Venue(models.Model, HitCountMixin):
    id = models.AutoField(primary_key=True)
    name = models.CharField(verbose_name="Name",max_length=100, blank=True)

不要使用.values(…) 我寫了一篇簡短的文章,描述了這個[Django-antipatterns] 的幾個問題

from django.db.models import F, Sum


def function(request, userprofile_id):
    profile = request.user.profile
    venue = profile.venue
    venues = Venue.objects.filter(itemised_loyalty_card__user=profile).annotate(
        total=Sum(
            F('itemised_loyalty_card__add_points')
            - F('itemised_loyalty_card__use_points')
        )
    )

    return render(
        request,
        'main/account/venue_loyalty_card.html',
        {
            'venue': venue,
            'venues': venues,
        },
    )

然后在您的模板中枚舉venues並呈現總數:

{%for item in venues %}
    {{ item.name }}: {{ item.total }}
{% endfor %}

注意:Django 中的模型以PascalCase而非snake_case 編寫,因此您可能希望將 model 從Itemised_Loyalty_Card重命名為ItemisedLoyaltyCard

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM