有没有办法在Django Field
中存储任意数量的特定Model
,以便用户可以指定他或她认为必要的数量?这对于标签或图片上传非常有用。
答案 0 :(得分:3)
如果你想为模型添加未知量的属性,那么显而易见的设计选择就是将它们分开。
假设您有一个Post
课程,并希望将Tag
分配给帖子。您无法知道任何帖子将被标记多少个标签。
你可以这样建模:
class Post(models.Model):
author = models.CharField(max_length=255)
text = models.TextField()
class Tag(models.Model):
name = models.CharField(max_length=100)
attached_to = models.ForeignKey(Post)
请注意:这是在未经测试的情况下编写的,请将其视为虚拟代码。
答案 1 :(得分:1)
根据您想要与记录关联的数据类型,您要么想要使用ForeignKey创建指向原始记录的模型,要么想要在原始记录上创建ManyToManyField。
在每个记录多个图像的示例中,您希望与该记录关联的图像和仅记录。在这些情况下,您设置一个外键,将图像指回记录。像这样:
class Record(models.Model):
name = models.CharField(max_length=100)
class Photo(models.Model):
record = models.ForeignKey(Record, related_name="photos")
image = models.ImageField()
对于标签,不同的记录都可以具有相同的标签。例如,你可以有一个被标记的记录" apples"和#34;农场"另一个被标记的记录" apples"和"食谱"。对于这两个记录,您希望指向带有文本" apple"的标记记录。您可以使用文本" apple"为每个创建标记记录,但这是不必要的数据重复,并且可能在将来导致问题。使用ManyToMany记录修复此问题。
您对记录模型进行了更改:
class Record(models.Model):
name = models.CharField(max_length=100)
tags = models.ManyToManyField("Tag")
并创建Tag模型:
class Tag(models.Model):
text = models.CharField(max_length=100)
这是Django编程的更基本的数据库设计,但是无论何时你在解决目标是"为给定记录存储 x 的多个值的问题" ,答案几乎总是"创建一个表来存储 x 的值,并将其链接回记录表"。在Django中,使用ForeignKey
或ManyToManyField
完成了这项工作。
答案 2 :(得分:0)
我认为您最好使用新的表/模型存储您的变量字段数,并使用ForeignKey引用它们。
答案 3 :(得分:0)
如果您使用postgresql数据库,您可以尝试其中一个新的Postgres特定字段:ArrayField,HStoreField,JsonField(JsonB将在1.9中完成)。 https://docs.djangoproject.com/en/dev/ref/contrib/postgres/fields/
如果您不需要与这些任意数据的外键关系,那么它可能是一个很好的选择。