DRF: 方向一对多查询

那年仲夏 提交于 2020-08-10 00:54:24

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')

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!