2016-09-22 72 views
1

我正在通过Tango使用Django书籍,并决定添加一些我自己的功能,但有一个问题。Django:将一个模型的字段链接到另一个字段

我有两个型号,类别和页面

class Category(models.Model): 
    name = models.CharField(max_length=128, unique=True) 
    views = models.IntegerField(default=0) 
    likes = models.IntegerField(default=0) 
    slug = models.SlugField(unique=True) 

class Page(models.Model): 
    category = models.ForeignKey(Category) 
    title = models.CharField(max_length=128) 
    url = models.URLField() 
    views = models.IntegerField(default=0) 

现在我想要做的是使该类别该类别中的“意见”字段的所有页面的意见和

在我的测试数据库脚本人口,我做这种方式:

cats = {"Python": {"pages": python_pages, 
        "views": sum(page["views"] for page in python_pages), 
        }, 
     "Django": {"pages": django_pages, 
        "views": sum(page["views"] for page in django_pages), 
        }, 
     "Other Frameworks": {"pages": other_pages, 
          "views": sum(page["views"] for page in other_pages), 
          } 
     } 

该方法适用于填充数据库,但我会如何让这个类别“意见”更新w ^每当页面“views”字段改变?

例如,如果同一类别的“视图”中的两个不同页面增加一个,那么类别的“视图”会增加两个?

+0

你确定你可以在设置您的分类相关对象的集合做想要这样做,而不是在实际需要时计算视图? –

+0

@DanielRoseman不一定,我真正唯一的要求是当“页面”视图上升时让“类别”视图更新。我没有设定任何特定的方式 –

回答

0

我会添加到您的类类,而不是使用视场:

def get_views(self): 
    views=0 
    for page in pages_set: 
     views+=page.views 
    return views 
0

当你需要它,而不是将其存储您应该计算这一点。

from django.db.models import Sum 
my_category.page_set.aggregate(Sum('views')) 

或使用annotationif你需要得到几种类别与他们的查看次数:

Category.objects.all().annotate(Sum('page__count')) 
相关问题