【问题标题】:Best way to set unique_together for all fields of a django model为 django 模型的所有字段设置 unique_together 的最佳方法
【发布时间】:2020-11-12 00:48:30
【问题描述】:

我想防止在我的数据库的某些表上创建重复的行。 我知道一种方法是将模型的Meta 类中的unique_togetherconstraints 属性设置为带有字段名称的元组,但我想知道是否有更好的方法这样做是因为我的模型有 30 多个字段,所以我认为再次重复它们的名称是不切实际的。

我现在的样子:

class MyModel(models.Model):
  model_id = models.BigAutoField(db_column="MyModelColumnID", primary_key=True)
  field1 = models.BooleanField(...)
  field2 = models.CharField(...)
  field3 = models. ...
  .
  .
  .
  field34 = models. ...
  
  class Meta:
    db_table = "MyTableName"
    unique_together = (
      "field1",
      "field2",
      "field3",
       .
       .
       .
       "field34"
    )
      

我正在寻找类似 @​​987654327@ 或 all_unique=True 的东西,这在 Django 上是否可行?

将其作为数据库约束处理对我来说很重要,get_or_create 方法是不够的,因为它适用于使用多个线程并对数据库进行多个并发调用的应用程序。谢谢!

【问题讨论】:

  • 据我所知,没有这样的事情。 所有字段一起是唯一的(并且模型有34个字段)也有点奇怪。 :)。通常可以在一个单独的模型中将字段“分组”在一起(例如Address,它是Profile 的一部分)。这导致可重用组件。
  • @WillemVanOnsem 就像不允许表格上出现重复行一样。这些字段中的大多数实际上是 ForeignKeys 和其他关系字段,无论如何,即使是 12 个字段或 8 个字段,我只想知道是否有办法在 Django 上这样做,所以我不必重复所有字段再次建模。

标签: python sql django database


【解决方案1】:

我没有找到一种方法来做我正在寻找的事情,但我设法通过定义一个抽象模型然后使用它来获取字段来不重复模型的所有字段名称。 像这样:

class MyModelBase(models.Model):
  model_id = models.BigAutoField(db_column="MyModelColumnID", primary_key=True)
  field1 = models.BooleanField(...)
  field2 = models.CharField(...)
  field3 = models. ...
  .
  .
  .
  field34 = models. ...
  
  class Meta:
    abstract=True

class MyModel(MyModelBase):

  class Meta:
    db_table = "MyTableName"
    unique_together = tuple(
      [field.name for field in MyModelBase._meta.fields if field.name != "model_id"]
    )

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 1970-01-01
    • 2016-01-12
    • 2012-09-27
    • 2013-12-20
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多