为COUNT个外键对象添加一列

时间:2011-06-15 19:29:15

标签: django django-models

我有以下型号 -

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    ...

class Video(models.Model):
    title = models.CharField(max_length=256)
    uploaded_by = models.ForeignKey('UserProfile')
    ...

我想为用户拥有的视频数量添加COUNT。

目前,为了获得用户的计数,我可以profile.video_set.count()

我想在UserProfile模型中有一个额外的列,所以我可以UserProfile.objects.order_by('video_count')。如何将此自定义行添加到模型中?谢谢。

2 个答案:

答案 0 :(得分:2)

您尝试执行的操作不遵循database normalization规则。要走的路是使用注释:

UserProfile.objects.annotate(video_count=Count('video')).order_by('-video_count')

答案 1 :(得分:0)

如果您希望非常规化您的计数器,出于性能或任何其他原因,django-counter-field可让您轻松地执行此操作:

from django_counter_field import CounterField, CounterMixin, connect_counter

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    video_count = CounterField()
    ...

class Video(CounterMixin, models.Model):
    title = models.CharField(max_length=256)
    uploaded_by = models.ForeignKey('UserProfile')
    ...

connect_counter('video_count', Video.uploaded_by)