【问题标题】:Django: modify model’s field before saveDjango:在保存前修改模型的字段
【发布时间】:2020-07-23 21:33:26
【问题描述】:

我有一个模型,course,有一个 ImageField 和 FileField,所以我想在每次用户创建课程时创建一个文件夹。我想我可以在保存模型之前做到这一点,所以这是我的问题。

如何在方法中访问模型的字段?

Models.py

Class Course(models.Model):
 Thumbnail = model.ImageField(upload_to=“...”,...)

    def save(self, *args, **kwargd):
        ... #How can I alter here the ImageField parameters?
          super().save(*args, **kwargs)

【问题讨论】:

  • 访问模型的字段还是模型字段的实例?
  • 访问模型的字段

标签: python django django-models


【解决方案1】:

请参阅 here 获取模型的字段。

要获取对象实例的字段,那么它应该是

def save(self, *args, **kwargs):
     #### How can I alter here the ImageField parameters?
     self.Thumbnail = #do whatever you want here
     super().save(*args, **kwargs)

不可能在方法中更改字段的参数。它只能在字段定义中完成,因为必须先保存模型

【讨论】:

  • self.Thumnail 是实例,我正在尝试修改模型的字段参数,所以这不起作用
  • 这正是我提到的。要获取模型的字段,只需点击上面的链接。 :)
  • 我有模特的领域!谢谢!顺便问一下,我现在如何修改字段的参数?我知道在小部件中它类似于:widgets.attrs.parameter(...')
  • 你所说的参数是什么意思,你的意思是改变这个(upload_to=“...”,...)
  • 是的,(upload_to="...) 等等
【解决方案2】:

模型字段的实例可以像普通实例变量一样使用 self 访问。

例如在下面的模型类中,

class DummyModel(models.Model):
    key = models.CharField()
    value = models.TextField()

    def save(self, *args, **kwargs):
        value = self.value # self.value is a model field.
        super().save(*args, **kwargs)

在您的情况下,您可以使用 self.Thumbnail 访问它

【讨论】:

  • 有什么办法可以修改模型的字段参数吗?不是实例
【解决方案3】:

由于在创建模型字段之前无法修改模型字段的参数,正如@azyCrw4282 在他的回答中所说,可以使用模型实例的名称创建一个目录并将解析函数的文件上传到 上传到

models.py

def upload_to(instance, filename):
    return 'user_course/{0}/{1}'.format(instance.name, filename) #instance.name will be the name of the course


class Course(models.Model):
    name       = model.CharField(...)
    thumbnail  = models.ImageField(upload_to=upload_to, ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2013-12-26
    • 2011-05-17
    • 2016-11-19
    • 2021-08-24
    • 1970-01-01
    • 2015-08-21
    • 2018-03-20
    相关资源
    最近更新 更多