【问题标题】:Backbone: adding models to a collectionBackbone:将模型添加到集合中
【发布时间】:2014-12-22 20:17:57
【问题描述】:

一方面,我有三个 CollectionsView(从服务器获取的三种类型的模型),另一方面,我有一个像购物车一样工作的四分之一 CollectionView。这存储了与视图关联的其他三个集合中的项目(集合视图)。

问题是当我添加一个具有相同 id 的项目时,这是被编辑的,而不是添加到购物车 CollectionView 中。

例子:

function addToCart(model){
     ShoppingCartCollectionView.collection.add(model);
}

来自其他收藏:

// From one CollectionView
addToCart(this.model);

// From another CollectionView
addToCart(this.model);

此集合具有相同的 id,因为它们存储在服务器上的不同数据库中。

这是我的模型(Python ORM)

PRODUCT_TYPE = (
    ('EM', 'Empanada'),
    ('BE', 'Bebida'),
    ('OF', 'Oferta'),
)

# Create your models here.
class Producto(models.Model):

    nombre = models.CharField(max_length=50)
    precio_unidad = models.DecimalField(max_digits=8, decimal_places=2)
    descripcion = models.TextField()
    stock = models.IntegerField()
    status = models.BooleanField(default=True)
    imagen = models.ImageField(upload_to=upload_to)
    fecha_publicacion = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True


class Empanada(Producto):

    precio_docena = models.DecimalField(max_digits=8, decimal_places=2)
    product_type = models.CharField(max_length=2, choices=PRODUCT_TYPE, default='EM', editable=False)

    def __unicode__(self):
        return self.nombre


class Bebida(Producto):

    product_type = models.CharField(max_length=2, choices=PRODUCT_TYPE, default='BE', editable=False)

    def __unicode__(self):
        return self.nombre


class Oferta(Producto):
    product_type = models.CharField(max_length=2, choices=PRODUCT_TYPE, default='OF', editable=False)
    def __unicode__(self):
        return self.nombre

class Venta(models.Model):

    pedido = models.TextField()
    total = models.DecimalField(max_digits=8, decimal_places=2)
    status = models.BooleanField(default=True)
    fecha_publicacion = models.DateTimeField(auto_now_add=True)

如何解决?

谢谢!!!

【问题讨论】:

  • 您确定您的数据库结构设置正确吗?在我看来,来自products 数据库的产品都将具有唯一的 id (PK)。当有不同类型的产品时,您只需创建一个 FK 来指示 product_type;你不需要三个不同的表...
  • 感谢您的回答。我通过添加我的数据库来编辑帖子。是的,是多余的,但一种产品具有其他产品没有的属性。另一种模式?

标签: backbone.js collections views add repeat


【解决方案1】:

@KimGysen 对重组产品表的看法是正确的。从长远来看,拥有相同id 的不同产品会给您带来麻烦。这是一个可能适合您的数据库架构。

使用外键表

首先,您将有一个产品名称表,您可以在其中列出不同产品的名称,并为每种产品类型分配一个主键 (ID)。然后,对产品的不同属性进行分组,并为每个组制作一个单独的表格。在表格中,您将通过 ID 引用您的原始产品类型(这是您的外键)。这是一个简单的图表:

/*Name Table                             Prod Type 1
-------------------------------        ---------------------------------
| ID | Product Name | Prod Type        | ProdId | attr1 | ... |  attrN |
-------------------------------        ---------------------------------
| 1  | Product 1    |    1    |        |    1   | val1  | ... | valN   |
-------------------------------        ---------------------------------*/    

使用或围绕collection.set

您的另一个选择是覆盖 Backbone 中的 collection.set 方法,该方法负责识别您的集合中是否存在重复项。

作弊collection.set

如果您因为添加了具有相同 id 的两种不同类型的产品而遇到问题,您可以通过确保它们的 id 属性被称为 id 以外的名称来欺骗 collection.set(这是 set 使用的评估您的集合中是否必须使用相同的模型,除非您通过在模型定义中设置 idAttribute 属性来告诉它检查不同的属性)。那么collection.set 将不知道如何匹配传入的模型。

覆盖collection.set

如果您因为collection.set 没有存储您集合中已有的模型而遇到问题,那么您将不得不覆盖collection.set。让我知道这是否是您正在寻找的解决方案,我将在此处发布该答案。

创建一个新的ShoppingCart 模型

第三种可能性是拥有一个处理模型添加和删除的 ShoppingCart 模型。这是一个更复杂的解决方案。如果您提供有关如何使用您的购物车的更多详细信息,我可以提出一些关于如何开始使用的想法。

【讨论】:

  • 谢谢!我通过重组数据库然后从 django rest 框架修改序列化程序和 viewSet 解决了这个问题。再次,谢谢!!!!
  • 这可能是最好的方法。当我开始这篇回答文章时,我写了几行代码,向您展示如何覆盖collection.set,并且当我这样做时,很明显拥有相同 id 的不同产品会在未来让您头疼(骨干小时或确保您的收藏中没有骗子)。我意识到@Kim Gysen 确实有最好的建议,并简单地向您展示了如何实施它。很高兴它对你有用!
猜你喜欢
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多