代码之家  ›  专栏  ›  技术社区  ›  Micah Pearce

Django-对多个字段和进行分组

  •  0
  • Micah Pearce  · 技术社区  · 6 年前

    Django 2.1、python3.6

    我有两个模型

    house = (
        ('Clubs','Clubs'),
        ('Diamonds','Diamonds'),
        ('Hearts','Hearts'),
        ('Spades','Spades'),
        )
    
    class Card(models.Model):
        id           = models.CharField(max_length=36, blank=False, primary_key=True)
        card         = models.CharField(max_length=15, blank=False)
        number       = models.IntegerField(default=1)
        house        = models.CharField(choices=house)
    
    class Deck(models.Model):
        id       = models.CharField(max_length=50, primary_key=True)
        name     = models.Charfield(...)
        card        = models.ManyToManyField(Card, through='DeckCard')
    
    class DeckCard(models.Model):
        deck = models.ForeeignKey(Deck, on_delete=models.cascade)
        card  = models.ForeignKey(Card, on_delete=models.CASCADE)
    
        @property
        def number_sum(self):
            self._number_sum= self.card.aggregate(total=models.Sum('number'))['total']
            return number_sum
    

    属性字段 number_sum 成功返回正确的计数。不过,我现在想按 house

    卡看起来应该在哪里

    id...name........number...house
    1....ace_diamonds..1......diamonds
    2....two_diamonds..2......diamonds
    3....three_diamonds..3....diamonds
    4....four_diamonds...4....diamonds
    ...
    52...king_Spades...13....spades
    

    甲板看起来像

    id...name
    1...johnsdeck
    2...bettysdeck
    

    假设DeckCard如下所示

    deck..card
    1...ace_diamonds
    1...two_diamonds
    1...ace_diamonds (yes there can be duplicates)
    1...three_hearts
    2...ace_hearts
    

    Deck 是每个人的一套卡片。 DeckCard 是牌堆里的实体牌。和 Card 包含卡上的属性。

    所以在这个例子中,我希望有一个总计数和每个房子的计数 甲板1 总计:7(1+2+1+3) 心脏:3 黑桃:0

    甲板2 总计:1 红心:1

    self._number_sum= self.card.aggregate(total=models.Sum('number')) group by 这样除了总数之外,我还可以计算每间房子的总数。有人知道怎么做吗。

    {  
      card: ...
      numbers: {
                Total:1
                Diamonds:4
                Clubs:0
                Hearts:3
                Spades:0
                }
    }
    

    但这不是为了这个问题。我敢肯定最好放在 @property

    0 回复  |  直到 6 年前