是否可以枚举模型的相同实例?

时间:2013-07-30 18:43:56

标签: django django-models

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

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”,而不是将它们都命名为'Mixer - 1/4“Mono。'

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

1 个答案:

答案 0 :(得分: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)在delete方法中,我使用update方法一次更新相应的输入而不产生db开销(一个查询)。如果这不能完全正常工作,你仍然应该朝那个方向努力

4)所提出的unicode方法没有显式使用component_type.name和type.name属性,而是调用每个模型的相应unicode方法(您可能在将来更改ComponentType的unicode,Input将显示新版本)