【问题标题】:Django call a funtion in model save method and call another function to fill valueDjango在模型保存方法中调用一个函数并调用另一个函数来填充值
【发布时间】:2014-10-01 11:10:21
【问题描述】:

我在 Django 中有一个模型

class File(models.Model):
    NORMAL = 'normal'
    AD = 'ad'
    FILE_TYPE_CHOICES = (
        (NORMAL, 'Normal'),
        (AD, 'Ad'),
    )

    file_name = models.CharField(max_length=50)
    file_type = models.CharField(max_length=10, default=NORMAL,
        choices=FILE_TYPE_CHOICES)
    file_path = models.FileField('file', upload_to='documents/%Y/')
    duration = models.IntegerField()
    #prompt_id = models.CharField(max_length=50)

    def __unicode__(self):
        return self.file_name

    def save(self, *args, **kwargs):
        self.prompt_id = IvrUploadAudioFile(self.file_path)
        super(File, self).save(*args, **kwargs)

我在文件表中有一个 prompt_id 列,但我不想在添加/编辑中显示 prompt_id 字段。 我想插入 prompt_id 值,函数 IvrUploadAudioFile 将在幕后返回。所以我在这里覆盖保存方法。

那么在哪里写IvrUploadAudioFile函数。 这种情况怎么写

【问题讨论】:

  • 您可以将您的 IvrUploadAudioFile 放在任何地方,将它放在相同的模型模块中可能是有意义的。将 editable=False 添加到 models.CharField 参数中,以便在添加和编辑中显示。

标签: python django


【解决方案1】:

你可以在任何地方写它,只要它可以导入到你的项目中。

from <insert_path_here> import IvrUploadAudioFile # Function written somewhere else. You need to insert the correct path here
from django.db import models

class File(models.Model):
    NORMAL = 'normal'
    AD = 'ad'
    FILE_TYPE_CHOICES = (
        (NORMAL, 'Normal'),
        (AD, 'Ad'),
    )

    file_name = models.CharField(max_length=50)
    file_type = models.CharField(max_length=10, default=NORMAL,
        choices=FILE_TYPE_CHOICES)
    file_path = models.FileField('file', upload_to='documents/%Y/')
    duration = models.IntegerField()
    #prompt_id = models.CharField(max_length=50, editable = False)

    def __unicode__(self):
        return self.file_name

    def save(self, *args, **kwargs):
        self.prompt_id = IvrUploadAudioFile(self.file_path)
        super(File, self).save(*args, **kwargs)

要确保 prompt_id 字段在管理视图中不可编辑,请在模型中定义 prompt_id 字段时设置 editable = False 属性。

【讨论】:

    【解决方案2】:

    如果你想在 Django admin 中隐藏该字段,你需要将其设置为 editable=False: https://docs.djangoproject.com/en/1.7/ref/models/fields/#editable

    class File(models.Model):
        . . .
        prompt_id = models.CharField(max_length=50, editable=False)
    

    我不确定你打算通过将self.file path 传递给IvrUploadAudioFile 类来做什么,但是编写的代码不会返回该对象的主键。

    【讨论】:

      【解决方案3】:

      Django 模型只是普通的 Python 类,您可以向该类添加任意数量的辅助方法:

      class File(models.Model):
          # -- normal stuff
          prompt_id = models.CharField(max_length=50, editable=False)
      
          def ivr_upload_audio_file(self):
              # do something with self.file_path
              return something
      
          def save(self, *args, **kwargs):
              self.prompt_id = self.ivr_upload_audio_file()
              super(File, self).save(*args, **kwargs)
      

      至于您的其他问题,关于不显示该字段 - 您可以添加 editable=False 以在管理员和任何 ModelForms 中隐藏该字段 - 但是,如果您只想在管理员中隐藏它,但显示它以其他形式出现 - 您可以自定义您的管理员以不显示该字段:

      @admin.register(File)
      class FileAdmin(admin.ModelAdmin):
          fields = ('file_name', 'file_path', 'file_type', 'duration',)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-08
        • 2019-09-17
        • 2013-12-17
        相关资源
        最近更新 更多