0

我正在尝试创建一组模型来跟踪音频设备中的信号流。例如,为了正确建模混音器,我需要跟踪几个相同的输入和输出。例如:

class signal(models.Model):
    # e.g., 1/4" mono cable
    name = models.CharField(max_Length=100)
    def __unicode__(self):
        return self.name

class component_type(models.Model):
    # e.g., mixer
    name = models.CharField(max_length=250)
    def __unicode__(self):
        return self.name

class input(models.Model):
    # e.g., a single channel on a mixer
    type = models.ForeignKey("signal")
    component_type = models.ForeignKey("component_type")
    def __unicode__(self):
        return "%s - %s" % (self.component_type.name, self.type.name)

我可以为混音器添加多个 1/4" 单声道插孔的单独实例;这没问题。我想做的是自动枚举它们,这样我就可以跟踪每个单独的通道。例如,我想将混音器上的 1/4" 单声道输入的第一个实例表示为 'Mixer - 1/4" Mono 1',将第二个实例表示为 'Mixer - 1/4" 2' ,而不是将它们都命名为“混音器 - 1/4”单声道。

我想这将需要一个额外的字段并劫持保存方法,但我不太确定如何去做。谢谢!!

4

1 回答 1

1

这样的事情可能是一个很好的起点:

from django.db.models import F

class Input(models.Model):
  type = models.ForeignKey("signal")
  component_type = models.ForeignKey("component_type")
  number = models.IntegerField(default=0)

  def save(self, *args, **kwargs):
    if not self.pk:
      self.number = Input.objects.filter(component_type_id=self.component_type_id, type=self.type_id).count() + 1
    super(Input, self).save(*args, **kwargs)

  def delete(self, *args, **kwargs):
    Input.objects.filter(component_type_id=self.component_type_id, type=self.type_id, number__gt=self.number).update(number=F('number')-1)
    super(Input, self).delete(*args, **kwargs)

  def __unicode__(self):
        return "%s - %s" % (self.component_type, self.type, self.number)

我们重写 delete 方法以确保当一个输入被删除时,所有具有更高数字的输入都会获得一个新的正确数字。

一些注意事项:

1)如果这不起作用请不要拍,代码是草图

2)我冒昧地将模型名称大写,这是您也可以采用的标准做法

3)在删除方法中,我使用更新方法一次更新适当的输入,而不会产生数据库开销(一个查询)。如果这不能完全按原样工作,您仍然应该朝那个方向努力

4) 呈现的 unicode 方法没有显式使用 component_type.name 和 type.name 属性,而是调用每个模型对应的 unicode 方法(以后可能会更改 ComponentType 的 unicode,Input 会显示新版本)

于 2013-07-30T21:09:24.910 回答