【问题标题】:Django ORM query to get data from multiple tablesDjango ORM 查询从多个表中获取数据
【发布时间】:2018-12-22 01:08:56
【问题描述】:

我需要从多个表中检索数据以显示店铺名称、店铺位置、店铺月销售额(单位)、月销售额和从店铺接单的销售人员姓名。 下面是我的示例表示例:

订购

id      total_price   added_by_id(employee id)   customer_id
1       42480         2                          1
2       74920         3                          2
3       21000         3                          2
4       42480         2                          1

订单项

order_id      unit
1             1
1             2
2             2
2             2
3             2
4             5

客户

id    full_name      location  
1     Shop1          Example location1
2     Shop2          Example location2

员工

id    full_name      
1     Employee Name1          
2     Employee Name2          

结果表应该是

shop name    location     salesperson        sales volume   monthly sales
Shop1        location1    Employee Name1     8              43630
Shop2        location2    Employee Name2     6              95920

我的尝试:

Order.objects.select_related('account_customer').all()
.values('customer_id')
.annotate(total_sales=Sum('total_price'))
.filter(created_at__year=today.year, created_at__month=today.month)

它会返回

<QuerySet [{'customer_id': 1, 'total_sales': Decimal('43630.00')}, {'customer_id': 2, 'total_sales': Decimal('95920.00')}]>

我无法检索其他必要信息,例如店铺名称、位置、销售人员姓名、销量。

相关型号:

class Order(models.Model):
    added_by = models.ForeignKey(Employee, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    total_price = models.DecimalField(max_digits=18, decimal_places=2)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    unit = models.FloatField()

class Customer(models.Model):
    shop_name = models.CharField(max_length=100)
    address = models.CharField(max_length=100)

class Employee(AbstractUser):
    full_name = models.CharField(max_length=100)

我如何检索所有必要的信息?

【问题讨论】:

  • 可以添加你的相关模型吗?
  • 添加了@JerinPeterGeorge

标签: sql django django-orm


【解决方案1】:

您可以将必填字段添加到values() as,

Order.objects.select_related('account_customer').all() \
    .values('customer_id', 'other_field_1', ...) \
    .annotate(total_sales=Sum('total_price')) \
    .filter(created_at__year=today.year, created_at__month=today.month)


这等效于 SQL GROUP BY 语句。 更多详情请阅读official django doc


UPDATE-1

Order.objects.annotate(
    location=F('customer__address'),
    salesperson=F('added_by'),
    shop_name=F('customer__shop_name')
).values('shop_name', 'salesperson', 'location').annotate(sales_volume=Count('orderitem__unit'),
                                                          monthly_sales=Count('total_price'))

【讨论】:

  • 此查询不返回总成交量。查看我的结果表销售量列
  • 您的模型字段和结果表字段似乎不同。请更正它,或提供您希望生成的示例 SQL 语句
  • 我的结果表销量应该从 OrderItem 单位列计算。你有什么困惑吗?
  • locationsales volume 令人困惑
  • 位置在customer模型中指定为address,orderitem模型中的unit列需要根据订单外键计算
猜你喜欢
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2020-01-27
相关资源
最近更新 更多