Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 将模型中的对象列表另存为字段_Django_Django Models - Fatal编程技术网

Django 将模型中的对象列表另存为字段

Django 将模型中的对象列表另存为字段,django,django-models,Django,Django Models,我正在写网店,我有一个模型订单: 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_le

我正在写网店,我有一个模型
订单

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)
和订购产品:

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()
视图中
,当我需要获取用户订单时,我只需执行下一步:
Order.objects.get(client=request.user).orderproduct\u set

但我认为这是不对的。如何重建这些模型以获得期望的结果?

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

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

因此,它不是
get()
,而是:

orders = Order.objects.filter(client=request.user)
for order in orders:
    print order.orderproduct_set.all()
要在模板中使用此选项(评论中的问题),只需传递订单即可:

视图.py

class MyView(View):
    def get(self, request):
         ctx = {
             'orders': Order.objects.filter(client=request.user)
         }
         return render(request, 'my/template.html', ctx)
{% for order in orders %}
    {% for item in order.orderproduct_set.all %}
        {{ item.product_amount }}x {{ item.product }}<br/>
    {% endfor %}
{% endfor %} 
my/template.html

class MyView(View):
    def get(self, request):
         ctx = {
             'orders': Order.objects.filter(client=request.user)
         }
         return render(request, 'my/template.html', ctx)
{% for order in orders %}
    {% for item in order.orderproduct_set.all %}
        {{ item.product_amount }}x {{ item.product }}<br/>
    {% endfor %}
{% endfor %} 
{%用于订单%}
{order.orderproduct_set.all%}
{{item.product_amount}}x{{item.product}}
{%endfor%} {%endfor%}
@sthzg,产品编号保存在哪里?据我所知,有了
manytomy
,我不需要
OrderProduct
模型。那么如何在
订单
中保存一个
产品
的数量呢?或者我应该在
OrderProduct
中为
order
字段使用
manytomy
?对不起,仔细想想,这是正确的。一个
manytomy
是可能的,但它不是一个优雅的解决方案(因为
OrderProduct
的实例只能与一个
Order
相关。第二种方法的一个小问题是查询使用
get()
而不是
filter()
。一旦一个用户有多个订单,这可能会导致异常。否则看起来很好。@sthzg,那么您为什么删除了您的答案?它不正确吗?它可以工作,但设计上是错误的。
manytomy
关系的内容如下所示:A)一个
订单
可以与多个
订单产品
相关;b)一个
订单产品
可以与多个
订单
相关。a) 是正确的,但b)不是。一个
OrderProduct
只能属于一个
Order
实例。这就是为什么我认为你的第二种方法是更好的设计。