[英]Am using drf-spectacular for my Django rest api documentation, how to override our own endpoint
[英]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_team
和related_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.