【问题标题】:Django created_at field not added when creating an object [duplicate]创建对象时未添加Django created_at字段[重复]
【发布时间】:2021-04-03 23:42:49
【问题描述】:

我试图让 Django 自动将一个字段添加到一个对象,其中日期和时间作为时间戳保存在该字段中。

当我在视图中创建对象并进入管理页面时,会创建所有其他字段,但不会创建这个。

views.py:

newconf = ConfigUser.objects.create(
        ref=''.join(random.SystemRandom().choice(
            string.ascii_lowercase + string.ascii_uppercase + string.digits
        ) for _ in range(20)),
        name='',
        user=request.user,
        # Here I don't add created_at because I want it to be automatic (see models.py)
        cpu=cpu[0],
        gpu=gpu[0],
        ram=ram[0],
        ssd_m2=ssd_m2[0],
    )

models.py:

class ConfigUser(models.Model):

    ref = models.CharField(max_length=20, unique=True, default='')
    name = models.CharField(max_length=128, default='')
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

    cpu = models.ForeignKey(CPU, on_delete=models.CASCADE)
    gpu = models.ForeignKey(GPU, on_delete=models.CASCADE)
    ram = models.ForeignKey(RAM, on_delete=models.CASCADE)
    ssd_m2 = models.ForeignKey(SSD_M2, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

【问题讨论】:

    标签: python django django-models timestamp


    【解决方案1】:

    首先,确保检查所有模型迁移是否已完成。 其次,作为替代方案,您可以尝试直接从类创建“newconf”对象,而不是通过 objects.create() 方法,如下所示:

    # Create the record as object of the model class
    newconf = ConfigUser(ref=''.join(random.SystemRandom().choice(
                string.ascii_lowercase + string.ascii_uppercase + string.digits
                ) for _ in range(20)),
                name='',
                user=request.user,
                cpu=cpu[0],
                gpu=gpu[0],
                ram=ram[0],
                ssd_m2=ssd_m2[0])
    
    newconf.save()
    
    

    要让这个方法工作,你应该只在模型 ConfigUser 中添加 def__init__ 方法,传入所有的初始化参数。

    【讨论】:

      【解决方案2】:

      如果模型内部的字段是使用auto_now 属性集创建的,它还将包含属性editable=False,因此它不会显示在管理面板中。

      要克服这个问题,您需要覆盖您的 save 方法:

      class ConfigUser(models.Model):
          # some code
          created_at = models.DateTimeField(editable=False)
          
          def save(self, *args, **kwargs):
              if not self.id:
                  self.created_at = timezone.now()
              return super(User, self).save(*args, **kwargs)
      

      【讨论】:

      • 更简单的就是将该字段添加到只读字段中,因为这已经回答了应该作为重复关闭
      猜你喜欢
      • 2014-11-16
      • 2015-04-10
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 2021-04-30
      • 2021-03-16
      相关资源
      最近更新 更多