2015-04-27 20 views
2

我想写网络商店,和我有一个模型Order保存对象的列表作为一个字段

class Order(models.Model): 
    state_choices = ('ACTIVE', 'COMPLETED', 'FROZEN') 
    order_date = models.DateTimeField(auto_now_add=True) 
    delivery_time = models.CharField(max_length=100) 
    address_city = models.CharField(max_length=40) 
    address_street = models.CharField(max_length=40) 
    address_building = models.CharField(max_length=40) 
    state = models.CharField(max_length=200, default='ACTIVE') 
    products = models.ForeignKey(OrderProduct) 
    client = models.ForeignKey(CustomUser) 

而且OrderProduct

class OrderProduct(models.Model): 
    product = models.ForeignKey(Product) 
    product_ammount = models.IntegerField() 

,你可以看到,用户可以添加以订购不同的产品和每个产品的不同数量。因此,对于目前的型号,我可以添加只订购一种类型的产品。然后我把它改写在未来的方式:

class Order(models.Model): 
    state_choices = ('ACTIVE', 'COMPLETED', 'FROZEN') 
    order_date = models.DateTimeField(auto_now_add=True) 
    delivery_time = models.CharField(max_length=100) 
    address_city = models.CharField(max_length=40) 
    address_street = models.CharField(max_length=40) 
    address_building = models.CharField(max_length=40) 
    state = models.CharField(max_length=200, default='ACTIVE') 
    client = models.ForeignKey(CustomUser) 

class OrderProduct(models.Model): 
    product = models.ForeignKey(Product) 
    order = models.ForeignKey(Order) 
    product_ammount = models.IntegerField() 

而且在view,当我需要得到用户的订单,我只是做下一个:Order.objects.get(client=request.user).orderproduct_set 但我认为这是不正确的。如何重建这些模型以获得期望的结果?

+0

@sthzg,在哪里可以节省产品数量?据我所知,用'ManyToMany',我不需要'OrderProduct'模型。那么如何在'order'中保存一个'product'的ammount?或者''OrderProduct'中的'ManyToMany'用于'order'字段? – Andrew

+0

对不起,第二次以为这是正确的。 'manytomany'是可能的,但它不是一个很好的解决方案(因为'OrderProduct'的一个实例只能和一个'Order'有关。 – sthzg

+0

第二种方法的一个小问题是查询使用'get()'而不是如果一个用户有多个订单,这可能会导致异常,否则它看起来很好。 – sthzg

回答

2

在我看来,第二种方法非常好。

问题中的一个小错误是查询使用get()而不是filter()。一旦一个用户有多个订单,这将导致异常。

所以,代替get(),这将是:

orders = Order.objects.filter(client=request.user) 
for order in orders: 
    print order.orderproduct_set.all() 

要在模板中使用这个(从评论的问题),它是足以通过订单:

views.py

class MyView(View): 
    def get(self, request): 
     ctx = { 
      'orders': Order.objects.filter(client=request.user) 
     } 
     return render(request, 'my/template.html', ctx) 

我/ template.html

{% for order in orders %} 
    {% for item in order.orderproduct_set.all %} 
     {{ item.product_amount }}x {{ item.product }}<br/> 
    {% endfor %} 
{% endfor %} 
相关问题