Search code examples
pythondjangojoinmodelsdjango-queryset

Django Query including a table where no relation can be followed


i'm trying to 'join' this 4 models in a query. My starting point is a Team.id. I am trying to get the SkillRecord into the result but i am completly lost.

class Team(models.Model):
    user        = models.ForeignKey(User)
    id          = models.IntegerField(primary_key=True, null=False, unique=True)
    ...

class Player(models.Model):
    id              = models.IntegerField(primary_key=True)
    ...

class Transfer(models.Model):
    player          = models.ForeignKey(Player)
    seller          = models.ForeignKey(Team, related_name='transfer_seller')
    buyer           = models.ForeignKey(Team, related_name='transfer_buyer')
    date            = models.DateTimeField()
    ...

class SkillRecord(models.Model):
    player          = models.ForeignKey(Player)
    date            = models.DateTimeField(default=datetime.datetime.now)
    ...

Here is my humble approach so far

    def list_players(request, teamid):
        team = get_object_or_404(Team, id=teamid)
        players_transfers = Transfer.objects.filter(buyer=team).select_related('player')

I'm not really sure what would be my next step to get the SkillRecord model into the game. I seem to lack the basic gist of those kind of problems so i will need a poke i guess.

Also, feel free to give me further ideas how to do this, i'm more or less sure i could also solve this whole Transfer thing using manytomanyfields or so.

Thanks a lot


Solution

  • To grab SkillRecord as well you need to add related_name:

    class SkillRecord(models.Model):
        player          = models.ForeignKey(Player, related_name='skills')
        date            = models.DateTimeField(default=datetime.datetime.now)
    

    then make the query:

    qt = Transfer.objects.filter(...).select_related('player').prefetch_related('player__skills')
    

    then retrieve them like so:

    qt[0].player.skills.all()