【问题标题】:Django, m2m with same modelDjango, m2m 同型号
【发布时间】:2013-12-03 19:30:32
【问题描述】:

我的 django 应用中有以下模型:

产品型号:

class Product(BaseModel):
    company = models.ForeignKey(Company, null=True, blank=True)
    title = models.CharField(max_length=128,verbose_name="Product title")

订购模型:

class Order(BaseModel):
    company = models.ForeignKey(Company)
    products = models.ManyToManyField(Product)

我无法将多个相同产品添加到订单中。 例如,我有一个名为“Car”的产品,如何将多个 Car 对象添加到单个 Order 中?

每个订单可能包含多个产品(相同或不同)。

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    您需要为该任务使用第三张表,例如:

    class OrderProduct(BaseModel):
        order = models.ForeignKey(Order)
        product = models.ForeignKey(Product)
        quantity = models.IntegerField()
    

    然后就可以使用中间表https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

    class Order(BaseModel):
        company = models.ForeignKey(Company)
        products = models.ManyToManyField(Product, through='OrderProduct')
    

    与普通的多对多字段不同,您不能使用添加、创建或赋值(即order.products.add(prod))来创建关系。您应该在through 表中手动创建记录:

    prod = Product.objects.get(uuid=product)
    #order.products.add(prod)
    q = product_quantity
    order = order # order record must be created before
    
    OrderProduct.objects.create(order=order, product=prod, quantity=q)
    

    检查以下问题:

    【讨论】:

    • 如何添加产品到订单?在此更改之前,我使用的是代码:for product in products: prod = Product.objects.get(uuid=product) order.products.add(prod)
    【解决方案2】:

    与外键的多对多关系是反向的。您的 Order 模型中不需要外键。您需要的是链接到订单的产品模型中的外键(每个产品都会有一个订单):

    class Product(BaseModel):
    company = models.ForeignKey(Company, null=True, blank=True)
    order = models.ForeignKey(Order)
    title = models.CharField(max_length=128,verbose_name="Product title")
    

    【讨论】:

    • 但每个订单可能包含多个(不同或不同)产品。使用您的代码,它将无法正常工作。
    猜你喜欢
    • 2012-12-24
    • 2010-10-22
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-03-30
    相关资源
    最近更新 更多