首页 > 解决方案 > 在 Django 中存储多个用户输入值(端口号)的最佳方法?

问题描述

我是 Django 和数据库操作的新手,对 Python 有一定的了解。

我正在 Django 中构建一个 Web 应用程序,其中用户输入一个端口号(值在 1 - 65535 之间),但可以输入多个端口号。我正在使用默认的 SQLite 数据库。伪代码如下:

  1. 用户输入一个有效的端口号并点击回车
  2. 端口号分配给模型和字段名称(例如outbound_firewall_ports)并反映在 Web 应用程序中
  3. 如果需要,用户可以继续输入其他端口号

我将以下字段分配给我的班级模型:

outbound_firewall_ports = models.PositiveIntegerField(null=True, validators=[MinValueValidator(1), MaxValueValidator(65535)])

是使用上面的代码结合表单/视图/小部件来完成此操作的最佳方法,还是我应该使用另一个选项来从outbound_firewall_ports创建一个数组,然后存储在 SQLite DB 中?

标签: djangosqlitedjango-modelsdjango-forms

解决方案


因此,一个常见的错误被称为过早优化:事情似乎有些矫枉过正,而您试图尽早简化。

一对多关系或“复合字段”的主要区别在于您是否需要搜索多个关系之一。对于防火墙,如果传入请求在 ip X 端口 Y 上,它需要搜索与这两个匹配的规则是合乎逻辑的。因此,多对多关系是更好的选择。

现在,随着 的出现JSONField,在某些数据库上可以在数据库内完全搜索,这种区别变得有点模糊。

在这种情况下,我更喜欢 JSONField,因为端口数据并不复杂,没有深度嵌套,因此它本身就是一个数据模型,不需要数据库内计算。您的验证器需要多加注意,但除此之外,我会说这是一个教科书示例,说明您可以使用 JSONField 做什么。

对于关系方法,逻辑非常简单:

对于您收到的每个端口:

config = Config.objects.get(account_username=request.user.username)  # let's assume we are inside a view
port = request.POST.get('port', 0)
if port:
    config.outbound_firewall_ports.add(port)

对于 json 它有点复杂:

config = Config.objects.get(account_username=request.user.username)  # let's assume we are inside a view
port = request.POST.get('port', 0)
if port:
    current_ports = config.outbound_firewall_ports  or [] # type: list
    current_ports.append(port)
    config.outbound_firewall_ports = current_ports
    config.save()

推荐阅读