【问题标题】:How to select results from django model group by an attribute如何通过属性从 django 模型组中选择结果
【发布时间】:2017-09-26 22:40:37
【问题描述】:

我需要一些帮助来解决我无法用 Django 解决的问题(除非通过糟糕的嵌套处理)。

我有这三个模型:

class Article(models.Model):
    label = models.CharField(max_length=100)
    unity = models.ForeignKey('Unity')
    category = models.ForeignKey('Category')
    user = models.ForeignKey(User)

class Store(models.Model):
    label = models.CharField(max_length=100)
    address = models.TextField()
    products = models.ManyToManyField(Article, through='Offer')
    user = models.ForeignKey(User)

class Offer(models.Model):
    quantity = models.FloatField()
    price = models.FloatField()
    infos = models.TextField(blank=True)
    article = models.ForeignKey('Article')
    store = models.ForeignKey('Store')
    user = models.ForeignKey(User)

我想在我的模板中打印一个如下所示的表格:

Article | Quantity | Infos | Store_1 | Store_2 | Store_n
------- | -------- | ----- | ------- | ------- | -------
Ham     | 4        | Bla   | 4.2 $   | 5.0 $   |
Ham     | 6        | Bla   | 6.0 $   | 7.5 $   |

相反,我只设法打印了这个:

Article | Quantity | Infos | Store_1 | Store_2 | Store_n
------- | -------- | ----- | ------- | ------- | -------
Ham     | 4        | Bla   | 4.2 $   |         |
Ham     | 6        | Bla   | 6.0 $   |         |
Ham     | 4        | Bla   |         | 5.0 $   |
Ham     | 6        | Bla   |         | 7.5 $   |

通过在视图中执行此操作:

articles = Article.objects.filter(user=request.user)
for article in articles:
    article.offers = Offer.objects.filter(article=article)

然后在模板中嵌套两个 for:

{% for article in articles %}
    {% for offer in article.offers %}
        <tr>
           ...
        </tr>
    {% endfor %}
{% endfor %}

我能想到的唯一解决方案是在视图中按数量重新组合报价,但这意味着很多嵌套,我几乎可以肯定有更好的方法来做我想做的事,但我可以找不到解决办法。。

谁能帮我解决这个问题?非常感谢!

【问题讨论】:

标签: django django-templates models manytomanyfield


【解决方案1】:

使用序列化器关系的类似方法应该可以帮助您以更有效的方式实现目标:

class OfferSerializer(serializers.ModelSerializer):

    class Meta:
        model = Offer
        fields = ('quantity', 'infos', 'store')


class ArticleSerializer(serializers.ModelSerializer):
    offer = OfferSerializer()

    class Meta:
        model = BlogPost
        fields = ('label', 'offer')

【讨论】:

  • 如果我是对的,ModelSerializer 仅适用于我的项目中不使用的 Django REST 框架,还有其他方法吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多