我刚刚启动 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/