【发布时间】:2021-04-14 19:41:06
【问题描述】:
我的情况:做快递。我有一个客户,它有一个价目表。价目表具有基于邮政编码的定价区域。客户有DeliveriesOrders,可以有多个Deliveries(取货、送件),价格根据邮政编码计算。
我计算交货行价格的方式是:
sheet_zones = customer.price_sheet.price_sheet_zones.filter(postal_codes__code=OuterRef("postal_code"))
delivery_orders = DeliveryOrder.objects.select_related("customer") \
.prefetch_related(
Prefetch(
'deliveries',
queryset=Delivery.objects.annotate(price=Subquery(sheet_zones.values("price"))).order_by("-is_pickup"),
to_attr="priced_deliveries"
)
)
这使我能够为每个交货行注释价格。
但是我不能注释预取字段,因为它会导致错误,所以.annotate(Sum("priced_deliveries")) 不起作用。
我很难得到一个交付订单中所有交付的总和。但更让我摸不着头脑的是,如何通过一个名为“reference”的字段对所有交货进行分组,并对每个参考的所有交货价格求和。
相关模型:
class DeliveryOrder(models.Model):
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, related_name="delivery_orders")
class Delivery(models.Model):
delivery_order = models.ForeignKey(DeliveryOrder, on_delete=models.SET_NULL, null=True, related_name="deliveries")
is_pickup = models.BooleanField(default=True)
reference = models.CharField(max_length=64, blank=True, null=True)
postal_code = models.IntegerField()
客户相关模型:
class PriceSheet(models.Model):
name = models.CharField(max_length=255)
class Customer(models.Model):
name = models.CharField(max_length=255)
price_sheet = models.ForeignKey(PriceSheet,
on_delete=models.SET_NULL, blank=True, null=True, related_name="customers")
class PriceSheetZoneItem(models.Model):
price_sheet = models.ForeignKey(PriceSheet, on_delete=models.SET_NULL, null=True, related_name="price_sheet_zones")
zone = models.ForeignKey(Zone, on_delete=models.SET_NULL, null=True, related_name="price_sheet_zones")
postal_codes = models.ManyToManyField(PostalCode, related_name="price_sheet_postal_codes")
price = models.DecimalField(decimal_places=2, max_digits=9)
邮政编码相关:
class Town(models.Model):
name = models.CharField(max_length=64)
class Zone(models.Model):
name = models.CharField(max_length=32)
class PostalCode(models.Model):
code = models.IntegerField()
town = models.ForeignKey(Town, on_delete=models.SET_NULL, null=True, related_name="postal_codes")
我愿意接受所有的建议和帮助。我很可能试图以错误的方式做到这一点。
使用 Django 3.2
提前谢谢你!
【问题讨论】:
标签: python-3.x django orm