2017-10-21 2 views
1

을 통과해야 항목을 만들 수 있습니다. 항목이 태스크를 통과하자마자 태스크는 완료된 것으로 표시됩니다. 작업의 이름은 미리 알려져 있습니다.장고 모델은 나는 다음과 같은 시나리오에 대한 모델을 만들기 위해 노력하고 다양한 작업

  • 작성 항목
  • 작업 1
  • 작업이
  • '항목의 로그를 확인'
  • 작업 3 '항목을 설치'항목을 등록 ': 예를 들어

저는이 간단한 모델로 시작했습니다. b 그것은 매우 정적 인 것처럼 보이고 실제로는 내가 찾고있는 것이 아닙니다. 내가 두 항목을 작성하는 경우,

class Task(models.Model): 

    name = models.CharField(max_length=128) 
    done_by = models.CharField(max_length=64, blank=True) 
    done_date = models.DateField(null=True, blank=True) 


class Item(models.Model): 

    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 
    tasks = models.ManyToManyField(Task) 

을하지만 : 작업을 정의하는 사전 위해 ManyToMany 필드 예를 들어, 관계형 필드를 시도

models.py

class Item(models.Model): 

    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 

    task1_name = models.CharField(max_length=128) 
    task1_done_by = models.CharField(max_length=64, blank=True) 
    task1_done_date = models.DateField(null=True, blank=True) 

    task2_name = models.CharField(max_length=128) 
    task2_done_by = models.CharField(max_length=64, blank=True) 
    task2_done_date = models.DateField(null=True, blank=True) 

    # ... next 20 tasks 

    def __str__(self): 
     return str(self.item_id) 

, 내가 이것으로 끝났다 동일한 작업을 수행하고 첫 번째 항목의 작업을 완료로 표시하면 두 번째 항목에서도 완료로 표시됩니다. 이는 내가 원하는 것이 아닙니다.

특정 항목에 작업을 할당하는 방법은 무엇입니까? 아니면 다른 모델이 내 시나리오에 가장 적합할까요?

답변

1

개체 생성시 코드를 실행하려면 일반적으로 save() 메서드를 재정의하십시오. 아이템이 생성됩니다 때, 저장() 메소드에 작성하고 링크를 동적으로 작업 코드 업데이트에

class Item(models.Model): 
    item_id = models.PositiveIntegerField() 
    item_priority = models.PositiveSmallIntegerField(default=2) 
    item_date_created = models.DateField(auto_now_add=True) 

    # remove m2m !!! 

    def save(self, *args, **kwargs): 
     # If it has no pk then it is a *new* item 
     if not self.pk: 

      # Save by manually 
      # Call save of parent class (models.Model) creating the custom class 
      super(Item, self).save(*args, **kwargs) 

      # Now you have the PK 
      t1 = Task(name='T1', item=self) 
      t1.save() 
      #... 

class Task(models.Model): 
    name = models.CharField(max_length=128) 
    done_by = models.CharField(max_length=64, blank=True) 
    done_date = models.DateField(null=True, blank=True) 

    # Add Item FK 
    item = models.ForeignKey(Item) 

참고 Item.tasks하기 :

1) 나는 방향을 변경 : 작업 링크를 다른 방향으로 돌리지 말고 https://docs.djangoproject.com/en/1.11/topics/db/examples/many_to_one/

2) 아직 새 인스턴스인지 확인한 다음 슈퍼 저장을 호출 한 다음이 항목에 대한 작업을 만듭니다.

self.pk 값을 확인하십시오. 그렇지 않으면 객체를 업데이트 할 때도 코드가 실행됩니다.

또한 매번 Item 개체에 링크 된 새 Task 개체를 만들어야한다는 것을 알고 있어야합니다. 하나의 작업 객체를 두 개의 항목에 연결하면 item_a가 작업을 완료하면 item_b에 대해서도 작업이 완료된 것처럼 보입니다.

당신이해야 할 일은 item_a에 대한 task1과 item_b에 대한 task2를 만드는 것입니다. 이렇게하면 작업을 분리 할 수 ​​있습니다.

읽기에 : 내가 같은 작업에이 개 항목을 만들 경우 첫 번째 항목의 작업을 표시 :

https://docs.djangoproject.com/en/1.11/ref/models/instances/#saving-objects

https://docs.djangoproject.com/en/1.11/topics/db/models/#relationships

+0

나는 내 문제를 명확하게 내 질문을 약간 조정 한 마찬가지로 그것은 두 번째 항목에서 완료로 표시됩니다 - 이것은 내가 뭘 원하는지 아니며 나는 이것에 대한 해결책을 찾고 있습니다. –

+1

Item 클래스 (models.Models)는 데이터베이스 객체의 템플릿입니다. 인스턴스를 작성합니다. 하나의 타스크 인스턴스를 두 개의 타스크 인스턴스에 링크하고 타스크를 갱신하는 경우 타스크 인스턴스를 링크하는 두 개 항목에 대해 동일하게됩니다. 당신이해야 할 일은 item1을위한 task1과 item2를위한 task2를 생성하는 것입니다. 이렇게하면 작업을 분리 할 수 ​​있습니다. – rollinger

+0

나는 이해하기 시작했다. 나는 새 작업을 만들어서 새 항목에 연결해야하며 다시 사용할 수 없습니다. 손으로 작업을 만들고 추가하는 코드 예제가 있습니까? –

관련 문제