model
class RunnerInfo(models.Model):
"""
跑步信息
"""
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='runner_info',
help_text='用户'
)
distance = models.IntegerField(
_('distance'), default=0, help_text='距离')
avg_pace = models.IntegerField(
_('avg_pace'), default=0, help_text='平均配速')
cost_time = models.IntegerField(
_('cost_time'), default=0, help_text='消耗时间')
runner_id = models.CharField(
_('runner_id'), max_length=30, help_text='路径信息id',
blank=True, null=True
)
runner_gps_url = models.URLField(
_('runner_gps_url'), max_length=1024, help_text='路径信息link',
blank=True, null=True
)
caloric = models.IntegerField(default=0, help_text='卡路里')
yd_create_time = models.DateTimeField(
_('yd_create_time'),
help_text="yd创建时间",
null=True,
blank=True,
)
is_deleted = models.BooleanField(_('is_deleted'),
default=False, help_text='是否删除')
create_time = models.DateTimeField(_('create time'),
help_text='创建时间', auto_now_add=True)
update_time = models.DateTimeField(_('update time'),
help_text='更新时间', auto_now=True)
class Meta:
verbose_name = _('RunnerInfo')
verbose_name_plural = _('RunnerInfo')
def __str__(self):
return str(self.id)
class RankingInfo(models.Model):
"""
比赛排名表,当比赛参加人数满后,
该比赛暂停参加,数据不再发生变动,备份到数据库
#1.异步触发.
#2.定时触发
"""
user = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name='ranking_info',
help_text='参赛用户'
)
rank_type = models.ForeignKey(
RankTypeInfo,
on_delete=models.CASCADE,
related_name='ranking_info',
help_text='赛事类型'
)
runner_info = models.ForeignKey(
RunnerInfo,
on_delete=models.CASCADE,
null=True, blank=True,
related_name='ranking_info',
help_text='跑步信息'
)
view.py
class RunnerInfoSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
IsAuthenticatedViewSet):
"""用户跑步信息"""
queryset = RunnerInfo.objects.all() \
.filter(is_deleted=False)\
.prefetch_related('ranking_info')\
.order_by('-id')
serializer_class = RunnerInfoSerializer
serializer_map = {
'list': RunnerInfoSerializer,
'retrieve': RunnerInfoDetailSerializer,
}
序列化
- 错误方法,to_representation
class RunnerInfoSerializer(ModelSerializer):
"""
RunnerInfoSerializer
"""
ranking_info = serializers.PrimaryKeyRelatedField(
many=True, read_only=True)
class Meta:
model = RunnerInfo
fields = '__all__'
read_only_fields = [
'is_deleted', 'update_time', 'create_time',
]
# def to_representation(self, instance):
# data = super().to_representation(instance)
# ranking_info = instance.ranking_info.all()\
# .filter(is_deleted=False).first()
# if ranking_info:
# data['ranking_info'] = ranking_info.id
# else:
# data['ranking_info'] = None
# return data
sql 优化生效
- prefetch_related('ranking_info')
来源:oschina
链接:https://my.oschina.net/tplinuxhyh/blog/4313424