django - 在 Django 中存储多个用户输入值(端口号)的最佳方法?
问题描述
我是 Django 和数据库操作的新手,对 Python 有一定的了解。
我正在 Django 中构建一个 Web 应用程序,其中用户输入一个端口号(值在 1 - 65535 之间),但可以输入多个端口号。我正在使用默认的 SQLite 数据库。伪代码如下:
- 用户输入一个有效的端口号并点击回车
- 端口号分配给模型和字段名称(例如outbound_firewall_ports)并反映在 Web 应用程序中
- 如果需要,用户可以继续输入其他端口号
我将以下字段分配给我的班级模型:
outbound_firewall_ports = models.PositiveIntegerField(null=True, validators=[MinValueValidator(1), MaxValueValidator(65535)])
是使用上面的代码结合表单/视图/小部件来完成此操作的最佳方法,还是我应该使用另一个选项来从outbound_firewall_ports创建一个数组,然后存储在 SQLite DB 中?
解决方案
因此,一个常见的错误被称为过早优化:事情似乎有些矫枉过正,而您试图尽早简化。
一对多关系或“复合字段”的主要区别在于您是否需要搜索多个关系之一。对于防火墙,如果传入请求在 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()
推荐阅读
- image-processing - 如何为图像聚类添加新特征(数据)以改善结果?
- powershell - 使用 GUI Textbox.Text 创建文件夹和添加子文件夹
- splunk-query - 将 json splunk 日志转换为表查询
- c# - 带有 C# MongoDB 驱动程序的 AWS DocumentDB,不支持的高效分页
- flutter - 我的问题是关于颤振的包地理编码。当我尝试使用 Placemarks 数据获取地址时,运行后出现两种错误:
- javascript - Busboy 不适用于 azure 函数中的 async/await
- ada - gprbuild 项目文件中是否可以有文件通配符?
- ios - iOS 密码图片
- .net-core - 自定义 MsBuild 任务因程序集加载错误而失败
- postgraphile - 在 PostGraphile 查询过滤器“或”运算符不起作用