【问题标题】:DJango Composite priamary key with instance field valuesDJango 复合主键与实例字段值
【发布时间】:2021-12-27 20:17:28
【问题描述】:

您好,我在 django 3.2 中遇到了复合键的问题。根据我的客户要求,他需要一个复合键作为主键,而不仅仅是在 unique_together 约束上,所以我想知道是否有任何方法或地方可以在验证之前拦截实例并使用来自其他字段的值填充复合键并将其保存到数据库ej:

class MyModel(models.Model):
   foo = models.UUIDField(default=uuid.uuid4,
                          auto_created=True, editable=False, max_length=36)
   bar = models-charfield()
   taz = models.charfield()
   composite_key = models.charfield(primary_key=True, default = 'foo' + 'taz' + 'foo')

这些行中的某些内容我无法从 django 管理站点上的表单字段验证器中获得通过,因此我真的无法测试信号或 save() 方法,任何帮助都将不胜感激。

【问题讨论】:

  • 删除composite_key 中的default 并通过使用其他字段填充composite_key 值来覆盖模型保存方法。像这样覆盖stackoverflow.com/questions/4269605/…
  • 现在可以正常工作了,但是我可以仅从命令行创建用户,并且我从视图(我不使用的女巫)中推测,但从管理站点我无法通过“composite_key”必填字段

标签: django django-models django-forms django-signals django-3.2


【解决方案1】:

试试这个:

class MyModel(models.Model):
   foo = models.UUIDField(default=uuid.uuid4,
                          auto_created=True, editable=False, max_length=36)
   bar = models.charfield()
   taz = models.charfield()
   composite_key = models.charfield(primary_key=True)

   def save(self, *args, **kwargs):
      self.composite_key = self.foo
      if self.bar:
         self.composite_key += self.bar
      if self.taz:
         self.composite_key += self.taz
      super(Model, self).save(*args, **kwargs)

【讨论】:

  • 我确实让我的复合键工作但在管理站点中无法保存,因为表单在 save() 之前需要复合键,因此 int 目前为空且无法通过验证
  • 在表单中你可以覆盖 clean 方法,就像你覆盖 save 方法并绕过复合键的验证
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 2011-06-11
  • 2018-11-07
  • 2018-10-25
相关资源
最近更新 更多