【问题标题】:ORM for Multiple relational databases in DjangoDjango中多个关系数据库的ORM
【发布时间】:2021-03-08 09:58:18
【问题描述】:

假设我在一个 App 中有 3 个模型,我需要使用 Order 类获取商品的价格。我怎样才能实现这样的功能?另外,由于 OrderItem 具有多对多字段,我想寻求有关如何从所有项目中循环并获取价格的帮助。

模型.py

class Item(models.Model):
    title = models.CharField(max_length=100)
    description = models.TextField()
    price = models.FloatField()


class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                            on_delete=models.CASCADE)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    ordered = models.BooleanField(default=False)

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    ordered_date = models.DateTimeField(auto_now_add=True)
    ordered = models.BooleanField(default=False)
    total_price = models.FloatField(null=True, blank=True)

Views.py

def get_price(request):
    order = Order.objects.filter(user=request.user, ordered=False)
    return render(request, 'ecommpage/history.html', {'order':order})

历史.html

{% extends 'account/base.html' %}
{% load static %}
{% block content%}
{%for order_item in order.item.all() %}
{{order_item.items.price}}
{% endfor %}
{% endblock %}

错误信息:

无法解析余数:'()' from 'order.items.all()'

当我尝试打印函数 get_price 时,它​​没有显示任何内容。

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    由于itemsManyToManyField,你必须这样做:

    for order_item in order.items.all():
        print(order_item.item.price)
    
    def get_price(request):
        order = Order.objects.get(user=request.user, ordered=False)
    
        for order_item in order.items.all():
            print(order_item.item.price)
    

    【讨论】:

    • 谢谢,它有效。我想知道这是否也适用于模板?
    • 我无法在模板上实现代码。它什么也没显示!
    • 请编辑您的问题(或创建新问题)并向我们提供模板代码。如果get_price 是您的模板视图,它应该返回render,上下文中至少包含order。然后,在模板中,你可以循环遍历order.items.all()
    • all()中删除()
    • 我删除了 (),但它没有显示任何内容。
    【解决方案2】:

    您无需循环获取所有价格。你可以像这样简单地aggregate他们:

    from django.db.models import Sum
    
    order = Order.objects.get(user=request.user, ordered=False)
    total_price = order.items.aggregate(total=Sum('price'))['total']
    

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 2014-02-16
      • 2019-09-26
      • 1970-01-01
      • 2011-06-27
      • 2019-02-09
      • 2023-03-23
      • 2019-04-22
      • 2017-07-18
      相关资源
      最近更新 更多