2010-01-21 2 views
1

다음 상황을 모델링하고 싶습니다. 나는 아이템 테이블과 플레이어 테이블을 가지고 있으며 플레이어는 많은 아이템을 가질 수 있고 동일한 아이템의 복사본을 여러 개 가질 수 있습니다. 여러 항목이있는 플레이어를 쉽게 모델링 할 수 있습니다.Django - 이것을 올바르게 모델링하는 방법은 무엇입니까?

class Item(models.Model): 
    name = models.CharField(max_length = 200, blank = False) 

class Player(models.Model): 
    items = models.ManyToManyField(Term) 

하지만 각 항목의 빈도, 즉 각 항목의 빈도를 알고 싶습니다. 어떻게하면 장고에서 이것을 가장 잘 모델링 할 수 있을까요? quantity 필드,

피트

답변

1

항목이 고유하지 않은 경우 Daniel Roseman이 제안한대로 PlayerItem 모델을 사용하여 through model으로 정의 할 수 있습니다. 두 번 당신이 unique_together을 사용할 수있는 동일한 항목을 저장하지 않도록하려면

class Item(models.Model): 
    name = models.CharField(max_length = 200, blank = False) 

class Player(models.Model): 
    items = models.ManyToManyField(Item, through='PlayerItem') 

class PlayerItem(models.Model): 
    player = models.ForeignKey(Player) 
    item = models.ForeignKey(Item) 
    quantity = models.IntegerField(default=1) 

    class Meta: 
     unique_together = ('player', 'item') 

그러나 항목이 약간 다를 것 또는 당신은 취득일을 할 필요가있는 경우 예를 들어, 당신은 다른 설정이 필요합니다

class Item(models.Model): 
    name = models.CharField(max_length = 200, blank = False) 

class Player(models.Model): 
    items = models.ManyToManyField(Item, through='PlayerItem') 

class PlayerItem(models.Model): 
    player = models.ForeignKey(Player) 
    item = models.ForeignKey(Item) 
    acquired = models.DateTimeField(default=datetime.datetime.now) 

이를 각 아이템에 대해 (플레이어, 아이템) 튜플의 중복을 저장할 시간입니다. 그런 다음 count()을 통해 특정 항목의 번호를 가져올 수 있습니다.

PlayerItem 모델에 Item도 아니고 Player도 연락 할 수 없다는 점에 유의하고 싶습니다. 두 경우 모두 여분의 필드에 액세스하려면 PlayerItem을 직접 쿼리해야합니다. (문서화 된대로)

5

사용 explicit through table

건배 (나는 :) 내 포인트 전체의를 얻을 내 실제 모델/문제를 simplfied했습니다).

관련 문제