【问题标题】:Arbitrary Amount of Fields for Django ModelDjango模型的任意数量的字段
【发布时间】:2015-09-15 00:32:42
【问题描述】:

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

【问题讨论】:

  • 我正在寻找类似 @​​987654326@ 之类的东西,但要寻找模型。
  • 如果我是你,我会打破表格并将其设为可重复字段的前键...然后应用内联表单集...
  • Django 文档非常详尽,并且很好地涵盖了关系。甚至还有detailed examples,如果这还不够,可以在stackoverflow 上轻松找到您的问题的重复项,例如this onethat one

标签: python django


【解决方案1】:

如果您想为模型添加未知数量的属性,显而易见的设计选择是将它们分开。

假设您有一个 Post 类并希望将 Tags 分配给一个帖子。您无法知道任何帖子将被标记多少个标签。

你可以这样建模:

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)

请注意:这是未经测试编写的,将其视为虚拟代码。

【讨论】:

  • 这是错误的。别人告诉我使用ManytoMany 关系。
  • 没有错。但是你当然可以使用 m2m。 docs.djangoproject.com/en/1.8/topics/db/examples/many_to_many 对于你的问题,我仍然会使用我的 FK 解决方案...
  • 如何在代码中而不是在管理界面中向模型中添加更多的外键?
【解决方案2】:

根据您希望与记录关联的数据类型,您可以创建一个使用 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”和“farms”,而另一条记录标记为“apples”和“recipes”。对于这两个记录,您希望指向带有文本“apple”的标记记录。您可以使用文本“apple”为每个标签记录创建一个标签记录,但这是不必要的数据重复,并且可能会在将来导致问题。使用 ManyToMany 记录可以解决此问题。

您对 Record 模型进行了更改:

class Record(models.Model):
    name = models.CharField(max_length=100)
    tags = models.ManyToManyField("Tag")

并创建标签模型:

class Tag(models.Model):
    text = models.CharField(max_length=100)

这是 Django 编程的更基本的数据库设计,但是当您解决目标是“为给定记录存储 x 的多个值”的问题时,答案几乎总是“创建一个表来存储 x 的值,并将其链接回记录表”。在 Django 中,这是使用 ForeignKeyManyToManyField 完成的。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这样一个奇怪的名字。非常不合适。
    • @MalikBrahimi :如果您将其视为 另一个模型的键另一个 db 表的键,它就会变得合适! ;)
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2013-08-19
      • 2018-02-13
      • 2011-08-04
      • 2012-07-12
      • 2020-05-19
      • 1970-01-01
      相关资源
      最近更新 更多