算法问题:多个数据库

时间:2012-08-25 21:55:53

标签: django django-models django-views

我试图用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

2 个答案:

答案 0 :(得分: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 documentation on valuesand annotate了解其工作原理 基本上,将为每个唯一的值组合生成注释 在您的情况下,这意味着您获得每个用户/披萨组合的计数。

旁注:

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

答案 1 :(得分:0)

我认为你真的不需要Pizza_total_eated表: 只需要披萨餐桌:

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'))

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

 [(4, u't', 2), (4, u'c', 1), ...]