在Django ORM中,如何在反向集查询中获取计数

2024-09-27 09:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下三种模式:

class Member (models.Model):
    FederationID = models.FloatField(unique=True)
    User = models.ForeignKey(User, on_delete=models.CASCADE)
    height = models.IntegerField(blank=True, null=True)
    eye = models.CharField(blank=True, null=True, max_length=10)
    hair = models.CharField(blank=True, null=True, max_length=10)
    birthdate = models.DateField()
    bio = models.TextField()
    Address = models.ForeignKey(Address, on_delete=models.CASCADE, null=True, blank=True)
    Phone = models.ForeignKey(Phone, on_delete=models.CASCADE, null=True, blank=True)
    Photos = models.ManyToManyField(Photos)
    Rank = models.ManyToManyField('Rank', through='Promotion')
    Unit = models.ManyToManyField('Unit', through='Assignment')

class Genre(models.Model):
    ShortName = models.CharField(max_length=50)
    LongName = models.CharField(max_length=500)

    def __str__(self):
        return self.LongName + ' (' + self.ShortName + ')'


class Career(models.Model):
    ShortName = models.CharField(max_length=50)
    LongName = models.CharField(max_length=500)

    def __str__(self):
        return self.LongName + ' (' + self.ShortName + ')'


class Rank(models.Model):
    RANK_TYPE_CHOICES = (
        ('O', 'Officer'),
        ('E', 'Enlisted'),
        ('V', 'Civilian'),
        ('C', 'Cadet'),
    )
    ShortName = models.CharField(max_length=50)
    LongName = models.CharField(max_length=500)
    Type = models.CharField(max_length=1, choices=RANK_TYPE_CHOICES, default='O')
    Genre = models.ForeignKey(Genre, on_delete=models.DO_NOTHING)
    Career = models.ForeignKey(Career, on_delete=models.DO_NOTHING)
    image = models.ForeignKey(Photos, on_delete=models.DO_NOTHING)

    def __str__(self):
        return self.LongName + ' (' + self.Career.LongName + ') from ' + self.Genre.LongName


class Promotion(models.Model):
    Rank = models.ForeignKey(Rank, on_delete=models.DO_NOTHING)
    Member = models.ForeignKey(Member, on_delete=models.CASCADE)
    PromotionDate = models.DateField(default=now)

    def __str__(self):
        return self.Member.User.first_name + ' ' + self.Member.User.last_name + ' promoted to ' + self.Rank.LongName + ' on ' + str(self.PromotionDate)

我通过晋升在等级和成员之间建立了多对多关系。
在model Rank中,我有Type字段。你知道吗

我需要一个计数和分组的类型字段为每个成员的最新推广。你知道吗

像这样:{'officer':4, 'enlisted':2, 'Civilian':12}

我添加了这个来获得每个成员的排名:

self.promotion_set.latest('PromotionDate').Rank

但我需要这个。你知道吗

我很欣赏这里的智慧。谢谢


Tags: selftruemodelonmodelsdeletelengthmax

热门问题