迭代包含多个实例的实例字段?

时间:2015-07-10 14:31:51

标签: mysql django

这是我第一次使用django,我遇到了一些问题,无法理解数据的存储方式,因此我无法按照自己的意愿使用它。我做了很多研究但是我找不到任何相关的问题,可能是因为我没有合适的关键词。

在我的app模型中,我创建了一个WebPage和Count类:

class Count(models.Model):
    date = models.DateField(default=date.today)
    count = models.IntegerField(default=0)

class WebPage(models.Model):
    link = models.CharField(max_length=60)
    id = models.AutoField(primary_key=True)
    clicks = models.IntegerField(default=0)
    stats = models.ForeignKey(Count)

然后我创建了一个包含多个WebPage个对象的Count对象,我想创建一个方法来检索count个实例的总和。

def get_clicks(self):
    self.clicks=0
    for object in self.stats:
        self.clicks+=object.count

    return str(self.clicks)

但我收到错误'Count' object is not iterable这是逻辑错误,因为我将self.stats定义为单个Count对象。我告诉自己,如果Count instances没有存储在self.stats中,那么它们可以存储为“全局”计数实例,因此我遍历对象实例for object in self._meta.fields但是多个Count实例丢失:

statistics.WebPage.link
statistics.WebPage.id
statistics.WebPage.clicks
statistics.WebPage.stats

而且我认为迭代“全局”Count个对象不是一个选项,因为我无法知道哪个Count instance属于哪个WebPage

隐藏了self.stats Count个实例的位置?谢谢你的帮助!

(我正在使用django 1.7)

2 个答案:

答案 0 :(得分:0)

web_page = Webpage.objects.get(pk=1)

def get_clicks(web_page):
    return web_page.contact_set.count()

如果你有一个网页,这将有效。如果您获得了一组网页,则可以遍历它们并为每个网页调用get_clicks。

答案 1 :(得分:0)

问题是你的ForeignKey是错误的方式。定义FK的模型是"很多"一对多关系的一面。也就是说,你拥有它的方式,每个Count都有很多WebPages,而我认为你想要反过来。

然后,您可以通过聚合将一页附加到您的网页的计数加起来:

List<string> customerNames = (from c in customerNamesByIDs 
                              orderby c.Key 
                              select c.Value).ToList();

或者,为了获得整个网页查询集的点击次数:

from django.db.models import Sum

total_clicks=my_web_page.count_set.aggregate(Sum('count'))