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   |

"""

これは、ユーザーが食べた特定の種類のピザの総数を格納します。基本的に、ユーザーが食べたピザの総数を取得したい

ピザを1つだけ持っていると、合計数を簡単に取得できます。

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のドキュメントをvalues読んannotateで、これが機能する理由を確認できます。
基本的に、値の一意の組み合わせごとに注釈が生成されます。
あなたの場合、これは、ユーザーとピザの組み合わせごとにカウントを取得することを意味します。

サイドノート:

これにより、カウンターフィールドをインクリメントするのではなく、必要に応じて新しいレコードを挿入するため、競合状態も防止されます。また、ユーザーがピザを食べたときなど
、モデルに追加の(関連する)情報を保存することもできます。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、2番目の値はピザの種類、3番目の値はユーザーが食べたこの種類のピザの総数です):

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