簡體   English   中英

Django/DRF - REST API 端點,查詢參數可以查詢多個端點

[英]Django/DRF - REST API endpoint with query parameter that goes queries multiple endpoints

嘿伙計們,我在嘗試構建此端點的工作方式時遇到了一些麻煩。 目前我希望這個端點"/nba/players?date=01012016"通過兩個不同的端點來工作以獲得結果。

目前我的 GameDates 端點返回類似於

{id: 1, home_team_id: 1, away_team_id: 2, date: "1/1/2016"},
{id: 4, home_team_id: 2, away_team_id: 3, date: "1/2/2016"}

我想獲取 GameDate_id 或它的主鍵(在本例中為 id:1),然后將其傳遞到另一個 PlayerStatistic 端點,該端點將返回如下內容 -

{id: 1, game_id: 1, player_id: 1, team_id: 1, points: 20, assists: 10, rebounds: 2},
{id: 2, game_id: 1, player_id: 2, team_id: 1, points: 15, assists: 2, rebounds: 2},
{id: 3, game_id: 1, player_id: 3, team_id: 2, points: 10, assists: 2, rebounds: 20},
{id: 4, game_id: 1, player_id: 4, team_id: 2, points: 5, assists: 1, rebounds: 2}

我的帶有日期查詢的初始端點將返回這四個 JSON,因為玩家在該日期 (game_id = 1) 從 GameDate 端點進行了游戲,然后該 game_id 用於查詢 PlayerStatistic 端點並返回。

我知道說覆蓋 get_queryset function 之類的正確方法 -

 def get_queryset(self):
        date = self.request.query_params.get('date')
        queryset = self.queryset
        if date:
            # the rest here?

獲取參數,但我不確定如何從那里獲取 go。

編輯 - 在下面添加了我的模型 -

class Player(models.Model):
    # class for Player model

    name = models.CharField(max_length=100)
    team_id = models.ForeignKey(Team, on_delete=models.CASCADE)


class GameDate(models.Model):
    # class for GameDate model

    home_team_id = models.ForeignKey(Team, related_name='home_games',
                                     on_delete=models.CASCADE)
    away_team_id = models.ForeignKey(Team, related_name='away_games',
                                     on_delete=models.CASCADE)
    date = models.DateField()


class PlayerStatistic(models.Model):
    # class for individual player statistics

    game_id = models.ForeignKey(GameDate, on_delete=models.CASCADE)
    player_id = models.ForeignKey(Player, on_delete=models.CASCADE)
    team_id = models.ForeignKey(Team, on_delete=models.CASCADE)
    points = models.IntegerField()
    assists = models.IntegerField()
    rebounds = models.IntegerField()

請從您的所有ForeignKey字段中刪除_id ,這會使代碼非常混亂:如果您有一個Player實例,那么player.team_id是一個Team實例(不是團隊的 id),而player.team_id_id是 id。 看看有多混亂?

因此,假設您已刪除所有_id ,以下是獲取特定日期的所有玩家統計信息的方法:

PlayerStatistics.objects.filter(game__date=date)
# or inside `get_queryset(self)`:
super().get_queryset().filter(game__date=date)

您可以按比賽進一步排序(如果同一日期有不止一場比賽),然后是球隊和最高分:

PlayerStatistics.objects.filter(game__date=date).order_by('game', 'team', '-points') 

date必須是datetime.date object,所以如果您的輸入是字符串,那么請確保首先將其轉換為正確的日期 object。

如果您實際上列出了特定日期的Player實例(並且想要嵌套每個玩家的相關統計信息):

Player.objects.filter(
      Q(team__home_games__date=date) 
    | Q(team__away_games__date=date))\
              .prefetch_related('playerstatistics')

在這里,我在home_teamrelated_name字段上更改了您的away_team ,因為它們用於反向關系,如您在此處看到的(從團隊到游戲),因此它們應該包含單詞games而不是team

如果您只想要已記錄統計數據的玩家,請嘗試以下操作:

from django.db.models import Exists, OuterRef

player_stats = PlayerStatistics.objects.filter(game__date=date, player=OuterRef('pk'))
Player.objects.filter(
      Q(team__home_games__date=date) 
    | Q(team__away_games__date=date))\
        .annotate(has_stats=Exists(player_stats))
        .filter(has_stats=True)
        .prefetch_related('playerstatistics'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM