Django在模型保存方法中调用一个函数,并调用另一个函数来填充值

时间:2014-10-01 11:10:21

标签: python django

我在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字段。 我想插入一个函数IvrUploadAudioFile将在场景后面返回的prompt_id值。所以我在这里重写了保存方法。

所以在哪里写IvrUploadAudioFile函数。 如何写这种情况

3 个答案:

答案 0 :(得分:1)

如果您正在谈论想要在Django管理员中隐藏字段,则需要将其设置为editable=Falsehttps://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类,我不确定您打算做什么,但编写的代码不会返回该对象的主键。

答案 1 :(得分:1)

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来隐藏管理员和任何ModelForm中的字段 - 但是,如果您只想将其隐藏在admin,但以其他形式显示 - 您可以自定义管理员以不显示该字段:

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

答案 2 :(得分: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属性。