2013-07-30 3 views
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 "모노 잭의 개별 인스턴스의 수를 추가 할 수 있습니다, 즉 아무 문제 없습니다 내가하고 싶은 어떤 것이되도록을 자동으로 열거입니다 I 예를 들어 믹서의 1/4 모노 입력의 첫 번째 인스턴스를 '믹서 - 1/4 "모노 1'로 표시하고 두 번째 인스턴스를 'Mixer - 1/4'2 '가되어서는 안됩니다.

나는이 추가 필드가 필요합니다 상상하고,이 방법을 저장 하이재킹,하지만 난 그것에 대해 감사를 이동하는 방법을 아주 잘 모르겠어요!

답변

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) 

우리는 입력이 삭제됩니다 때, 더 높은 번호를 가진 모든 입력이 새 정확한 수를 얻을 수 있도록하기 위해 삭제 메소드를 오버라이드 (override)

일부 노트 :.

,

1)이 그대로 작동하지 않을 경우 촬영하지 마십시오이 코드는 내가 모델 이름을 대문자의 자유를했다 스케치

2), 그것은 당신이 또한 채택 할 수있는 표준 관행이다

3) delete 메소드에서 db 오버 헤드 (하나의 쿼리)를 생성하지 않고 update 메소드를 사용하여 적절한 입력을 한 번에 업데이트합니다. 이것이 정확하게 작동하지 않으면 그 방향으로 작업해야합니다.

4) 제시된 유니 코드 메서드는 component_type.name 및 type.name 속성을 명시 적으로 사용하지 않지만 각 모델의 해당 유니 코드 메서드를 호출합니다 (당신은 나중에 ComponentType의 유니 코드를 변경할 수 있고 Input은 새 버전을 표시 할 것입니다.)

+0

저장 오버라이드를 알았지 만 삭제 무시가 훌륭합니다. 많은 감사합니다! 모델 명명 규칙에 대해서도 고맙게 생각합니다. 최근에 _set 이름에서 오류가 발생하여 작업을 마친 후에는 다시 작업을 중단했지만 이후의 공동 작업에서는 Applecarts를 뒤엎고 싶지 않습니다. 다시 한 번 감사드립니다! –

+0

당신을 환영합니다! 한 가지 더주의하십시오 : 관리자 액션 (입력의 변경 목록보기에서)을 통해 객체를 대량으로 삭제하면 delete 메소드가 호출되지 않습니다. 대안으로, post_delete 신호를 대신 사용할 수도 있습니다. 문제가 있다면 문제가 될 수 있습니다. https://docs.djangoproject.com/en/dev/ref/signals/#post-delete 및 https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects for을 참조하십시오. 자세한 정보! 희망이 도움이 – ppetrid

+0

그것은 매우 도움이 감사합니다! –

관련 문제