2 Слизняк в пути URL - PullRequest
       22

2 Слизняк в пути URL

1 голос
/ 09 июля 2019

Я хочу, чтобы URL был таким

example.com/lol/tournament/tournament-slug/match/match-slug

Я сделал это, однако, правильно ли использовать это так? Есть ли способ лучше? код: leagueoflegendsgame=game[0]

views.py

def lolmatch_detail(request, tournamentslug, lolslug):
    lolmatch=get_object_or_404(LeagueOfLegendsGame, lol_slug=lolslug)
    game=LeagueOfLegendsGame.objects.filter(lol_slug=lolslug)
    tournamentslug = get_object_or_404(Tournament, tournament_slug=tournamentslug, leagueoflegendsgame=game[0])

urls.py

path('lol/tournament/<str:tournamentslug>/match/<str:lolslug>', lolmatch_detail, name='lol_match_detail'),

models.py

class LeagueOfLegendsGame(Game):
    name=models.CharField(max_length=255,blank=True,null=True)
    lol_slug=models.SlugField(unique=True,max_length=255)
    tournament = models.ForeignKey(Tournament, on_delete=models.CASCADE, null=True, blank=True)
    match=models.ManyToManyField(Match)...

class Tournament(models.Model):
    name=models.CharField(max_length=255)
    tournament_slug=models.SlugField(unique=True,max_length=255)

1 Ответ

1 голос
/ 09 июля 2019

Вы можете сопоставить оба слага в одном запросе, например:

def lolmatch_detail(request, tournamentslug, lolslug):
    game = get_object_or_404(
        LeagueOfLegendsGame,
        lol_slug=lolslug,
        tournament__tournament_slug=tournamentslug
    )
    # ...

Здесь база данных создаст JOIN для поиска LeagueOfLegendsGame с lolslug и проверки, указывает ли она на Tournament с данным tournament_slug, и выдаст такой Tournament, если таковой существует .

...