0
class Ingredient(models.Model):
    ..
    status = models.CharField(max_length=16, default="pending")

class Food(models.Model):
    ..
    ingredients = models.ManyToManyField(Ingredient)


{% for i in food %}
    {% for j in food.ingredients.all %}

for ループ タグで、ステータスが「保留中」ではない各食品とその成分をリストしたいと思います。

クライアント側でチェックするために IF タグを使用したくありません。食品に保留中の成分がたくさん含まれている場合、サーバーは決して使用されない大量のデータを送信する必要があることを意味します。サーバーは、必要なデータのみを送信することを想定しています。

ご協力ありがとうございました。

4

1 に答える 1

1

まず第一に、db 設計の観点から、ステータス フィールドが選択肢のリストである方がよいでしょう。次のようになります。

class Ingredient(models.Model):
    NEW = 1
    PENDING = 2
    APPROVED = 3
    STATUS_CHOICES = (
        (NEW, 'New'),
        (PENDING, 'Pending'),
        (APPROVED , 'Approved'),
    )
    status = models.IntegerField(default=PENDING, choices=STATUS_CHOICES)

関係は多対多であるため、関連する成分のリストを取得するには、食品のリストを取得してからフィルターを適用します (各食品に orm フィルターを使用するビュー、または != を使用するテンプレートで)

food = Food.objects.all()

およびテンプレートで(ループの2行目の違いに注意してください):

{% for i in food %}
    {% for j in i.ingredients.all %}
        {% if j.status != 2 %}

このアプローチの問題は、すべての食品に対して効率的ではない可能性のあるデータベースクエリを送信することです。代わりに、ビューでこれを行うことができます:

food = Food.objects.prefetch_related('ingredients')

これにより、すべての食品について、関連するすべての材料が 1 つのクエリで取得されます。prefetch_related の問題は、フィルタリングも自分で行う必要があることです。

于 2013-09-07T18:10:16.090 に答える