我正在尝试创建一组模型来跟踪音频设备中的信号流。例如,为了正确建模混频器,我需要跟踪几个相同的输入和输出。例如:
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。'
我想这将需要一个额外的字段并劫持保存方法,但我不太确定如何去做。谢谢!
答案 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将显示新版本)