【问题标题】:How to add Two auto-generated field in one model in Django如何在 Django 的一个模型中添加两​​个自动生成的字段
【发布时间】:2022-11-01 23:02:57
【问题描述】:

我需要创建两个自动生成的字段: 第一个字段是 ID,我正在占据与 id 等效的位置,或者我们可以说它也是模型中自动生成的字段。

这是我正在集成的代码:

class DeviceControl(models.Model):
    vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE)
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    position = model.[what do I write here to make it auto generated or equal to id]

    def __str__(self):
        return self.name

请帮我解决这个问题。

【问题讨论】:

  • 你的意思是position 在生成id 时具有相同的值,对吗?
  • 如果你需要两个字段总是same value 你不需要创建第二个字段,因为它的值总是same as first field's value
  • 是的,我需要的位置完全一样
  • 我需要它,因为我想做可排序的,所以最初的值将是相同的,但在拖动到新位置后,我会相应地改变位置。并且 id 不会有任何效果。

标签: python django django-models django-rest-framework


【解决方案1】:

你可以重写save方法来设置position的初始值:

class DeviceControlPolicy(models.Model):
    vendor_id = models.ForeignKey(Vendor, on_delete=models.CASCADE)
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    position = models.IntegerField(blank=True, null=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
       super().save(*args, **kwargs)
       
       if self.position == None:
          self.position = self.id
          # You need to call save two times since the id value is not accessible at creation
          super().save()

【讨论】:

  • 请您稍微详细说明一下
  • @Mukul 您可以使用一个简单的整数字段,而不是使用第二个自动字段。首次创建模型实例(数据库记录)时,save 方法将position 的初始值设置为与id 相同的值。然后,当您需要时,您可以根据需要简单地更新 position 值,而无需更改 id 字段。如果positionNone,则save 方法会覆盖position 的值,因此在实例创建期间它将其值设置为id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2019-09-20
  • 2020-01-19
  • 2016-05-24
  • 2020-11-08
  • 1970-01-01
相关资源
最近更新 更多