python - Django 模型(动态?)

标签 python django django-rest-framework

我刚刚启动 Django 网站;

我决定使用一个模型(使用 SQLite DB),它具有以下属性:

class Flow(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE,
                              verbose_name="Owner", default="ADMIN")

    source = models.CharField(default='HTTP', choices=SOURCE_CHOICES, editable=True, max_length=12)
    name = models.CharField(max_length=50, default=" ")
    date = models.DateTimeField(verbose_name="Creation date")

我想根据源字段值将其他字段添加到此模型。

例如,如果选择源字段:"file"。我将创建附加字段(如文件名、文件目录...)如果选择“Http”,我将创建一个字段 URL。 因此,根据源字段,我将具有不同的字段和类型。

我读到这种模型很难在 Django 中表示;我对其他解决方案持开放态度。我的想法是创建尽可能多的模型作为可能的源值。

最佳答案

即使您可以在 Django 中创建动态字段,也无法在 Sqlite 表 FLOW 中创建动态列。

如果您计划在不同情况下使用相同类型的字段,您可以创建具有抽象名称的字段,例如path。这可以是作为本地文件路径的 URL。

通常,您需要为数据库表的所有选择创建所有列。

class Flow(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE,
                              verbose_name="Owner", default="ADMIN")

    source = models.CharField(default='HTTP', choices=SOURCE_CHOICES, editable=True, max_length=12)
    name = models.CharField(max_length=50, default=" ")
    date = models.DateTimeField(verbose_name="Creation date")
    local_path = models.ImageField(upload_to='files', null=True, blank=True) # when source is file
    url = models.URLField(null=True, blank=True) # when source is http

因此,当您使用 HTTP 源时,local_path 可能为空。

在 View 内部,您可以通过序列化器动态获取(或设置)值:

class FlowSerializer(serializers.ModelSerializer):
    path = serializers.SerializerMethodField(method_name='get_path_value')

    class Meta:
        model = Flow
        fields = ('owner', 'source', 'name', 'date', 'path')

    def get_path_value(self, instance):
        if instance.source == 'HTTP':
            return instance.url
        else:
            return instance.local_path

因此,不同来源的路径会有所不同。 也许您需要为此解决方案安装 django Rest 框架。

编辑1: 回答问题

So if I understand well, the best pratices should be to create 'blank' columns

你绝对必须描述表中的所有列(除非你使用非Sql-like DB,例如MongoDB)。所以是的,创建“空白”列只是一种可能的方法。

但是您可以重写模型中的save方法,以动态保存字段:

class Flow(models.Model):
  temp_path = None
  path = models...
  url = models...
  choice = models...
  
  def save(self, *args, **kwargs):
    if choice == 'HTTP':
      self.url = temp_path
    else:
      self.path = temp_path
    super().save(*args, **kwargs)

上面的代码只是一个快速的想法。不是真正有效的代码。

关于python - Django 模型(动态?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64537479/

相关文章:

python - 在 linux 上从另一个 python 脚本运行 python 脚本

python - 使用docker在heroku中部署Django api rest

python - 只能访问 Python unicode 字典中列表的最后一个元素

python - REST 服务 Google Analytics 集成

Django Rest Framework 测试失败或通过,具体取决于函数数量

Django 信号 request_finished 获取用户实例

python - 如何读取 csv 文件直到找到标题?

python - 在 python 中编写 "try elsetry"的最佳方法?

python - Django 的模型字段是在类级别定义的吗?

python - 如果窗口中的按钮已绑定(bind)到函数,如何使用按钮关闭顶级 tkinter 窗口