Django模型的任意数量字段

时间:2015-06-28 13:48:03

标签: python django

有没有办法在Django Field中存储任意数量的特定Model,以便用户可以指定他或她认为必要的数量?这对于标签或图片上传非常有用。

4 个答案:

答案 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。

您使用ForeignKey

的地方

在每个记录多个图像的示例中,您希望与该记录关联的图像和记录。在这些情况下,您设置一个外键,将图像指回记录。像这样:

class Record(models.Model):
    name = models.CharField(max_length=100)

class Photo(models.Model):
    record = models.ForeignKey(Record, related_name="photos")
    image = models.ImageField()

您想要使用ManyToMany字段

对于标签,不同的记录都可以具有相同的标签。例如,你可以有一个被标记的记录" 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中,使用ForeignKeyManyToManyField完成了这项工作。

答案 2 :(得分:0)

我认为您最好使用新的表/模型存储您的变量字段数,并使用ForeignKey引用它们。

答案 3 :(得分:0)

如果您使用postgresql数据库,您可以尝试其中一个新的Postgres特定字段:ArrayField,HStoreField,JsonField(JsonB将在1.9中完成)。 https://docs.djangoproject.com/en/dev/ref/contrib/postgres/fields/

如果您不需要与这些任意数据的外键关系,那么它可能是一个很好的选择。