>

Recommendations 를 주문했습니다   rating_prediction 에 의해  ID를 얻은 다음 필터링하면 Tracks 를 얻습니다. , 순서가 더 이상 동일하지 않습니다

class RecommendationView(generics.ListAPIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = RecommendedTrackSerializer
    queryset = Recommendations.objects.all()
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
    def get_queryset(self):
        recommendation = Recommendations.objects.filter(user=self.request.user)
        sorted_recommendation = recommendation.order_by('-rating_prediction')
        ids = list(sorted_recommendation.values_list('track', flat=True))
        tracks = Track.objects.filter(id__in=ids)
        return tracks

모델 :

class Recommendations(models.Model):
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        verbose_name='user which the recommendation is given',
    )
    track = models.ForeignKey(
        Track,
        on_delete=models.CASCADE,
        verbose_name="track which recommend to the user",
    )
    date = models.DateField(
        auto_now_add=True,
        verbose_name='when the recommendation was generated',
    )
    rating_prediction = models.FloatField(
        validators=[MinValueValidator(0), MaxValueValidator(5)]
    )
class Track(models.Model):
    track_id = models.CharField(max_length=24)
    artist = models.ForeignKey(Artist, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    link = models.URLField(max_length=255, blank=True)
    tags = models.ManyToManyField(Tag, through='Tagged', blank=True)
    similarity = models.ManyToManyField(
        'self',
        blank=True,
        through='FusionSimilarity',
        related_name='similar_to',
        symmetrical=False
    )
    users = models.ManyToManyField(User, through='PlayTrack', blank=True)

  • 답변 # 1

    당신은 다음과 같이 필터링합니다 :

    tracks = Track.objects.filter(id__in=ids)
    
    

    그러나 이것은아닙니다Track 를 의미합니다 s는 ids 와 같은 순서입니다. . 당신은 단순히 필터링하고, 데이터베이스가 이것을 어떻게 색인화했는지에 따라, 일반적으로 id 에 의해 목록 순서를 생성합니다 또는 다른 측정 항목 (예 : 기본 주문을 Track 에 첨부 한 경우)  모델). 이것은 데이터베이스 엔진에도 의존 할 수 있습니다. 주문을 언급하지 않으므로 데이터베이스는 주문을 선택할 수있는 "자유"가 있습니다.

    그러나 쿼리 양을 줄이고 다음과 같이 작성할 수 있습니다 :

    def get_queryset(self):
        return Track.objects.filter(
            recommendations__user=self.request.user
        ).order_by('-recommendations__rating_prediction')
    
    

    사용자가 트랙 당 하나의 추천 만 제공 할 수있는 경우 복제본이 생성되지 않습니다. 사용자가 트랙에 대해 여러 가지 권장 사항을 제공 할 수있는 경우 .distinct() 를 추가해야합니다.  전화.

    우리는 Track 를 얻는다 하나검색어

  • 답변 # 2

    Track.objects.filter(recommendation__user=self.request.user).order_by('-recommendation__rating_prediction')
    에서 특정 사용자가 추천 한 s와 사용자가이를 어떻게 권장했는지에 따라 주문합니다.
    

관련 자료

  • 이전 suitescript2.0 - netsuite - 수표 양식의 수취인 필드가 공급 업체인지 여부
  • 다음 pandas - Pandastable을 사용하여 데이터베이스를 업데이트하는 방법