python - Django 和 eBay 风格的多列表

标签 python django database database-design django-models

我正在尝试模仿 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/

相关文章:

python - Django 下一页在登录页面中不起作用

javascript - 知道为什么 adonis 迁移命令不起作用吗?

python - 错误: Could not locate a Flask application in VSCode

python - 我如何找出我正在使用的 Python 实现?

python - 如何让 LBForum (0.9.22) 运行

python - Django:使用 LayerMapping 更新现有模型?

node.js - AWS Beanstalk - 在工作人员和网络服务器之间共享数据库层

php - 如果不为空,则从重复的文本字段插入数据库 php sql

python - Keras 分类 - 对象检测

python - Django View 类: name 'self' is not defined