【问题标题】:Django ManyToMany Field or something else?Django ManyToMany Field 还是别的什么?
【发布时间】:2016-12-13 06:18:02
【问题描述】:

我有一个简单的电子商务网站,其中包含产品和变体。

每个变体肯定会有不同的权重,每个权重都有一个数量。

我已经实现了一个权重模型,它与变体的 ForeignKey 关系,因为每个变体可以有不同的权重,每个权重都有一个数量。

class Weight(models.Model):
    variation = models.ForeignKey(Variation)
    size = models.DecimalField(decimal_places=3, max_digits=8, 
                            validators=[MinValueValidator(Decimal('0.10'))])
    quantity = models.PositiveIntegerField(null=True, blank=True, help_text="Select Quantity for this size") 

我将重量添加为内联,并且可以在变体中添加多个重量值和数量。请看这个http://imgur.com/XLM6sQJ

人们可能认为这可以通过为每个重量创建变化来实现,但由于每个产品肯定会有不同的重量,因此无需为每个重量创建变化。

现在我面临的问题是每个变体都有不同的权重,例如变体的重量可能为 1 磅、2 磅、3 磅。这些中的每一个都将为每个变化创建新的权重对象。这意味着如果另一个变体的重量也为 1 磅、2 磅、3 磅,则会创建新对象,而不是重用现有对象。这将导致一个巨大的数据库表,其中包含许多重复的权重值。这是一个问题,因为任何产品所需的重量和数量值都是有限的(重量 = 1 磅到 100 磅,数量 = 1 到 100),因此理想情况下应该重复使用这些值。

为了避免这种情况,我正在考虑将带有 ManyToMany 字段的权重模型设置为 Variation,然后每个选定权重的数量都应该是下拉列表。这将允许存储重量和数量的值,并让每个产品在每个实例中使用相同的值。

我遇到的问题是:
1. 这是正确的做法吗?
2. 如果不是,最好的方法是什么?
3.如果这是正确的方法怎么办?
4. 如果这是正确的方法,我该如何在管理站点中显示这个,因为每个重量也应该有一个数量(我不知道如何做到这一点)?
5. 有没有更好的方法来实现这一点,如果有,怎么做?

【问题讨论】:

    标签: django django-models django-admin django-admin-filters django-admin-tools


    【解决方案1】:

    您对自己的工作方式有清晰的了解。

    我同意您的观点,即针对不同的变体重复使用相同的权重,而不是创建再次具有相同权重的新权重。 这是我认为更好的方法,可能有多种方法可以做到这一点。

    要回答您的问题,请在您的应用中尝试以下模型关系:

     class Quantity(models.Model):
         quantity = models.PositiveIntegerField()
    
     class Weight(models.Model):
         weight = models.PositiveIntegerField()
         quantity = models.ManyToManyField(Quantity)
    
    
     class Variation(models.Model):
         name = models.CharField()
         weight = models.ManyToManyField(Weight)
    

    然后在权重类中分别添加您需要的所有权重。因此,在您需要向 Variation 表添加一些权重之后,您可以从 Weights 类中选择权重,我们已经在其中添加了我们可能需要的权重。

    通过这种方式,您可以为不同的变体重复使用相同的权重,甚至不必有重复的记录。

    确保您已在管理员中注册这两个模型以便于访问。

    这应该可以解决您在权重表中有多个记录的问题。

    【讨论】:

    • 感谢您的回复。这并不能完全解决问题,因为对于每个重量,我也必须设置数量。在上述场景中,每个变体模型实例可以有多个权重,但只能有一个数量,而我还需要基于权重选项的数量。
    • 您可以为重量和数量创建两种不同的关系。我已经更新了答案。
    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 2016-01-02
    • 2011-08-10
    • 1970-01-01
    • 2011-10-03
    • 2016-12-30
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多