我试图用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
答案 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 values
and 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), ...]