我正在尝试模仿 eBay 的多列表功能。基本上,eBay 允许用户指定他们选择的两种变体,例如尺寸和颜色
。每个变体都会有不同的数据,例如:
Color: red, green
Size: 12, 9
然后它会变得有点困惑,例如:
quantity for color red, size 12: 15
quantity for color red, size 9: 12
quantity for color green, size 12: 20
quantity for color green, size 9: 59
用户必须指定每种变体混合物的数量,第一个变体优先。
让事情变得复杂的是,名称和颜色仅是示例。它们可以是不同的属性。
如何在数据库级别应用它?目前我只是生成一个这样的列表:
[color blue,size = 12,Quantity = 24,Price = 299,size = 23,Quantity = 43,Price = 298]
计划将列表作为字符串存储在字段中,并使用 JSON 重建它。
问题是,每个请求都需要进行不必要的处理。例如,如果数量减少,那么我不能只编辑一个字段,我必须使用标志从列表中找到正确的数量(不必要的处理),并对列表进行适当的更改,然后再次存储。
正在寻找替代方法?我无法为变体创建字段,因为它们是由用户指定的。
寻找方向。
我当前的表如下所示:
class Auction(models.Model):
auction_id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=50)
description = models.TextField(validators=[MaxLengthValidator(1000)])
price = models.PositiveSmallIntegerField(default = 0)
bid = models.PositiveSmallIntegerField(default = 0)
image = models.ImageField(upload_to = 'img/', default = 'img/None/no-img.jpg')
......
# stores multi listing list/dict
multi_listing = models.CharField(max_length=200)
flag = models.BooleanField(default=False)
slug = models.SlugField(unique=True, default = (randint(0,1000000)))
def __unicode__(self):
return self.name
最佳答案
JSON
Planning to store the list as string in a field, and using JSON to rebuild it.
如果您完全采用这种方法,您应该使用具有 native JSON 字段的数据库。在 django 官方支持的数据库中,只有 Mysql 和 Postgresql 有它。不幸的是,Django 不完全支持 mysql 版本,您将需要第三方库。
在这两者中,postgresql 具有更丰富的 functionality 集。并提供更好的索引选项。事实上,postgresql 中的 JSONB 足以与 Mongodb 相媲美。
如果您选择 JSON,则它必须是 Postgresql JSONB。没有什么比这更接近的了。使用 JSONB,无需重建任何内容,也无需仅为了更新 JSON 字典中的一项而获取完整字段。
但是你选择的数据结构是错误的。应该更像
[{'color': 'blue' , 'size': 12, 'Quantity': '24', 'Price': 299},
{'size': 23, 'Quantity': 43, 'Price' :298}]
但是哎呀,那仍然是 Array
Tip: Arrays are not sets; searching for specific array elements can be a sign of database misdesign. Consider using a separate table with a row for each item that would be an array element. This will be easier to search, and is likely to scale better for a large number of elements.
尽管如此,JSON 数组比 ArrayField 更有效
相关模型
这是更传统的方法。可能比使用 JSON 更好,如果你不使用 postgresl 的话肯定更好。您的模型可能如下所示:
class Auction(models.Model):
auction_id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=50)
description = models.TextField(validators=[MaxLengthValidator(1000)])
bid = models.PositiveSmallIntegerField(default = 0)
image = models.ImageField(upload_to = 'img/', default = 'img/None/no-img.jpg')
flag = models.BooleanField(default=False)
slug = models.SlugField(unique=True, default = (randint(0,1000000)))
def __unicode__(self):
return self.name
class Pricing(models.Model):
# stores multi listing list/dict
price = models.PositiveSmallIntegerField(default = 0)
color = models.CharField(max_length=12)
size = models.IntegerField(max_length=200)
auction = models.ForeignKey(Auction)
更新
because 'color' and 'size' is defined by user, it could be name something else. For example they may choose a different variation instead of 'size' and 'color', they might choose 'material' and 'color', so then how would you name the field?
这个解释倾向于 JSON。然而,仍然可以考虑其他两种替代方案。第一个是redis。不要使用 Redis 来完全替代 RBMS,而是将用户定义的属性存储在 Redis 中。
第二种选择是完全切换到nosql数据库,例如mongo。不幸的是,Django 与 nosql 的配合不太好。
关于python - Django 和 eBay 风格的多列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44362048/