0

我一直在尝试使用 django 获取吃的比萨饼总数

我的模型是这样的:

class pizza_total_eated(Model.models):
     user           #fk to users
     pizza          #fk to pizzas
     total_eated    #total number of `pizza` eaten

"""
+------+-------+-------+
| user | pizza | total |
+------+-------+-------+
|  1   |   1   |   5   |
|  1   |   2   |   6   |
|  2   |   3   |   4   |

"""

这存储了用户吃的某种类型的比萨饼的总数。基本上我想检索用户吃披萨的总数

当我只有一个披萨时,吃的总数很容易:

pizza_total = pizza_total_eated.objects.filter(Pizza = 1)

for user in pizza_total:
    user.total_eated

但是我怎么能为每个用户做这个=>每个披萨

for user in pizza_total
    for pizza in user.pizza
        pizza.total_eated     #user 1 -> pizza 1 so total_eated = 5
4

2 回答 2

1

试试这个备用数据结构:

class Pizza(models.Model):
    # pizza_stuff 
    # ...
    # ...

class PizzaEaten(models.Model):
    pizza = models.Foreingkey(Pizza)
    user = models.ForeignKey(User)

每次用户u吃披萨p时,你会:

PizzaEtean.objects.create(user = u, pizza = p)

然后,如果你想查询Pizza的用户你吃了多少,只需使用:

PizzaEaten.objects.filter(user = u).count()

如果要获取用户吃的每种类型的比萨饼数量,可以使用 Django 注释并执行以下操作:

from django.db.models import Count
PizzaEaten.objects.values('user', 'pizza').annotate(eat_count = Count('id'))

您可以阅读django 文档valuesannotate了解其工作原理。
基本上,将为每个唯一的值组合生成一个注释。
在您的情况下,这意味着您为每个用户/比萨饼组合获得一个计数。

边注:

这也将防止竞争条件,因为您不会增加计数器字段,而是在需要时插入新记录。
您还可以在模型上存储其他(相关)信息PizzaEaten,例如用户吃披萨的时间。

于 2012-08-25T23:37:06.590 回答
0

我不认为你真的需要 Pizza_total_eated 表:只要有一个 Pizza 表:

PIZZA_CHOICES = (
  ('t', 'Tomato'),
  ('c', 'Cheese')
)

class Pizza(models.Model):
    type = models.CharField(choices=PIZZA_CHOICES, max_length=2)
    user = models.ForeignKey(User)

然后查询将是:

Pizza.objects.values_list('user_id','type').annotate(total=Count('type'))

该查询将返回一个 3 元组列表(元组的第一个值是用户 id,第二个是比萨饼类型,第三个是用户吃的该类型比萨饼的总数):

 [(4, u't', 2), (4, u'c', 1), ...]
于 2012-08-25T22:53:23.637 回答