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

首先,从数据库设计的角度来看,如果您的状态字段是一个选项列表会更好。它会是这样的:

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

并在模板中(注意循环中第二行的区别):

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

这种方法的问题在于,对于每个食物,它都会发送可能效率不高的数据库查询。相反,您可以在您的视图中执行此操作:

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

这将在一个查询中为所有食品提供所有相关成分。prefetch_related 的问题是您还必须自己进行任何过滤。

于 2013-09-07T18:10:16.090 回答