【问题标题】:Django models deifinition many to many fieldDjango 模型定义多对多字段
【发布时间】:2016-10-10 19:08:24
【问题描述】:

我有以下情况:

class Product(models.Model):
    name = models.CharField(max_length=200)

class Order(models.Model):
    product = models.ManyToManyField(Product)
    quantity = models.IntegerField(default=0,validators=[MinValueValidator(1)])

在 admin.py 中

class ProductsInline(admin.TabularInline):
    model = Order.product.through

class OrderAdmin(admin.ModelAdmin):
    inlines = [ProductsInline,]
    filter_horizontal = ('product',)

我想在创建一个订单时为每种产品输入不同的数量,但对于此模型,这是不可能的。每个订单只能插入一个数量。

我想创建一个包含产品及其数量的中间类 ProductQuantity,然后将其添加到订单中,但我不知道在创建订单时是否可以“即时”创建 ProductQuantity .

我想不出任何解决方案,有人可以帮忙吗?

【问题讨论】:

    标签: django database-design django-models django-admin many-to-many


    【解决方案1】:

    我不确定我是否收到您的问题。这能解决你的问题吗?

    class Product(models.Model):
        name = models.CharField(max_length=200)
    
    class Order(models.Model):
        customer = models.ForeignKey(Customer)
    
    class OrderItem(models.Model):
        order = models.ForeignKey(Order)
        product = models.ManyToManyField(ProductQuantity)
        quantity = models.IntegerField(default=0,validators=[MinValueValidator(1)])
    

    编辑:

    使用上述模型,您可以创建以下订单:

    Products:
    +----+--------+
    | id |  name  |
    +----+--------+
    |  1 | apple  |
    |  2 | orange |
    |  3 | banana |
    +----+--------+
    
    Order:
    +----+-------------+
    | id | customer_id |
    +----+-------------+
    |  1 |         112 |
    |  2 |          99 |
    +----+-------------+
    
    OrderItem:
    +----+-------+---------+----------+
    | id | order | product | quantity |
    +----+-------+---------+----------+
    |  1 |     1 |       1 |       10 |
    |  2 |     1 |       2 |       20 |
    |  3 |     1 |       3 |       30 |
    |  4 |     2 |       1 |        5 |
    +----+-------+---------+----------+
    

    有来自两个不同客户的两份订单,一份有 10 个苹果、20 个橙子和 30 个香蕉。第二个订单只有 5 个苹果中的一个。

    【讨论】:

    • 我想要实现的是,当我创建订单时,我可以定义订单中每个产品的数量。上例中定义的数量是订单内的“通用”数量。例如,我想创建一个包含 10 个苹果、20 个橙子和 30 个香蕉的订单。
    • @thodoris 那么我想我确实正确理解了你的问题。我添加了一个示例,这样的订单在生成的 sql 表中的外观。
    • 好的。但是,如果我使用管理员创建订单,我将不得不经历许多步骤,首先创建一个订单,然后为该订单创建尽可能多的 OrderItems,这对用户来说不是很友好。我在想的是在 Order 中添加 OrderItem 作为 ManyToMany 字段。但这在管理界面中将链接到已经制作的 OrderItem。我想要实现的是“即时”生成 OrderItem。产品已经存在,但应在下订单时介绍数量。
    • 将 OrderItems 定义为 manytomany 没有意义,一个 OrderItem 只能属于一个 Order。如果您需要最大的可用性,那么管理员后端无论如何都不是创建订单的正确位置。第一步创建一个订单(指定客户),然后在以下步骤中添加 OrderItems。
    猜你喜欢
    • 2015-02-03
    • 2010-10-30
    • 2021-11-27
    • 2013-05-17
    • 2020-08-13
    • 1970-01-01
    • 2013-11-17
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多