0

我想在 Django 中过滤一个对象,并将其与结果为 ForeignKey 的任何对象一起返回。我不确定注释是我在这里需要的,还是其他的。

这是我的模型:

class Dress(models.Model):
  name = models.CharField(...)
  price = models.FloatField(...)

class ClothingSize(models.Model):
   code = models.CharField(...)

class DressSizeAvailable(models.Model):
  dress = models.ForeignKey(Dress)
  size = models.ForeignKey(ClothingSize)

假设我想过滤所有低于 50 美元的连衣裙,然后以可用尺寸显示它们。做这个的最好方式是什么?

我已经做到了:

# In view
results = Dress.objects.filter(price__lt=50)
# How to annotate with available sizes?

# In template
{% for result in results %}
  {{ result.name }}, ${{ result.price }}
  Sizes: {{ ??? }}
{% endfor %}
4

2 回答 2

1
### 1st solution (similar to Daniel Rosenthal's answer but with performances concern)
results = DressSizeAvailable.objects.filter(dress__price__lt=50).select_related('dress', 'size')
# then you can browse your DressSizeAvailables as you wish in your template. The select related allows you NOT TO query the database again when you generate your template

### 2nd solution
results = Dress.objects.filter(price__lt=50).prefetch_related('dresssizeavailable_set__dress')

{% for dress in results  %}
    {{ dress.name }}, ${{ dress }}
    Sizes: <ul>
        {% for dsa in dress.dresssizeavailable_set %}
            <!-- Thanks to the prefetch_related, we do not query the base again here -->
            <li>{{ dsa.size.code }}</li>
        {% endfor %}
    </ul>
{% endfor %}
于 2013-08-07T14:11:15.493 回答
0

您需要为您的模板提供DressSizeAvailable对象的查询集(或类似的东西)。因此,首先您需要获取所有Dress您感兴趣的对象,然后DressSizeAvailable根据这些 Dresses进行过滤

所以在你看来:

dresses = Dress.objects.filter(price__lt=50)
dress_size_available = []
for dress in dresses:
    available = DressSizeAvailable.objects.filter(dress=dress)
    dress_size_available.append(available)

然后渲染您的模板,将其传递给变量dress_size_available

然后,您的模板可以相当简单。

{% for dsa in dress_size_available %}
    {{ dsa.dress.name }}, ${{ dsa.dress.price }}
    Size: {{ dsa.size }}
{% endfor %}
于 2013-08-07T13:39:42.173 回答