如何解决如何通过外键访问特定订单的OrderItems
我正在建立一家网上商店来出售音乐。我的ProfileView出现问题,我想在此向客户显示他已购买的文件的已完成订单。
这是我的模特:
class Product(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField()
description = models.TextField()
image = models.ImageField(upload_to='product_images')
file = models.FileField(upload_to='product_files')
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
active = models.BooleanField(default=False)
soundkit = models.BooleanField(default=False)
licence_variation = models.ManyToManyField(LicenceVariation)
def get_absolute_url(self):
return reverse("cart:product-detail",kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('staff:product-delete',kwargs={'pk': self.pk})
def is_soundkit(self):
return self.soundkit
def __str__(self):
return self.title
def get_update_url(self):
return reverse("staff:product-update",kwargs={'pk': self.pk})
class OrderItem(models.Model):
order = models.ForeignKey("Order",related_name='items',on_delete=models.CASCADE)
product = models.ForeignKey(Product,on_delete=models.CASCADE)
licence_variation = models.ForeignKey(LicenceVariation,on_delete=models.CASCADE)
def __str__(self):
return self.product.title
def get_raw_total_item_price(self):
return self.licence_variation.price
def get_total_item_price(self):
price = self.get_raw_total_item_price()
return "{:.2f}".format(price / 100)
class Order(models.Model):
user = models.ForeignKey(User,blank=True,null=True,on_delete=models.CASCADE)
start_date = models.DateTimeField(auto_now_add=True)
ordered_date = models.DateTimeField(blank=True,null=True)
ordered = models.BooleanField(default=False)
billing_address = models.ForeignKey(Address,related_name='billing_address',on_delete=models.SET_NULL)
shipping_address = models.ForeignKey(Address,related_name='shipping_address',on_delete=models.SET_NULL)
def __str__(self):
return self.reference_number
@property
def reference_number(self):
return f"Order-{self.pk}"
def get_raw_subtotal(self):
total = 0
for order_item in self.items.all():
total += order_item.get_raw_total_item_price()
return total
def get_subtotal(self):
subtotal = self.get_raw_subtotal()
return "{:.2f}".format(subtotal / 100)
def get_raw_total(self):
subtotal = self.get_raw_subtotal()
return subtotal
def get_total(self):
total = self.get_raw_total()
return "{:.2f}".format(total / 100)
def get_order_item_set(self):
return self.items.all()
这是我的个人资料视图
class ProfileView(LoginRequiredMixin,generic.TemplateView):
template_name = 'profile.html'
def get_context_data(self,**kwargs):
context = super(ProfileView,self).get_context_data(**kwargs)
context.update({
"orders": Order.objects.filter(user=self.request.user,ordered=True),'order_items': OrderItem.objects.all
})
return context
显然,它正在显示模板中的所有OrderItems,因为我使用objects.all方法,但是我想对其进行过滤,因此它只显示属于正确订单的OrderItems。
有人可以帮助我以正确的方式过滤OrderItems吗?
非常感谢
解决方法
在模板中,您可以使用FK关系按订单对订单商品进行分组:
{% for order in orders %}
<h3>{{ order }}</h3>
{% for item in order.items.all %}
<p>{{ item }}</p>
{% endfor %}
{% endfor %}
但是,如果您只想按顺序列出所有商品的有序列表,则可以这样做
OrderItem.objects.all().order_by('order')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。