Django ORM - запрос в зависимости от сквозной таблицы - PullRequest
0 голосов
/ 14 ноября 2018

вот моя модель данных:

class User(Model):

    name = models.CharField(max_length=255)
    teams = models.ManyToManyField(Team, through=UserTeam, related_name='users')

class Team(Model):

    name = models.CharField(max_length=255)

class UserTeam(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    is_special = models.BooleanField(default=True)

Когда я запрашиваю всех пользователей, я получаю такой результат (результат json в остальных API:

{
    'name': 'user-1',
    'teams': [
        {
            'name': 'team-1',
        },
        {
            'name': 'team-2',
        }
    ]
}

Чего я хочу добиться, так это того, что я хочу получить только команды, для которых флаг is_special установлен в true для пользователя и команды.

например. Если пользователь состоит из двух команд, а одна команда имеет флаг is_special , установленный в значение false, эта команда должна быть исключена из приведенного выше результата ...

Вот почему я включил в свой пользовательский сериализатор:

teams = TeamSerializer(read_only=True, many=True)

def get_teams(self, obj):
    teams = Team.objects.filter(
        userteam__user=self.context['request'].user,
        userteam__is_special=True
    )
    serializer = UserSerializer(instance=teams, many=True)
    return serializer.data

Но я все еще получаю тот же результат ... какие-либо идеи или предложения?

спасибо!

1 Ответ

0 голосов
/ 14 ноября 2018

Вы можете добиться большего успеха, приближаясь к этому из сквозной таблицы.

Я не проверял это, и это не оптимальная производительность, но:

teams = TeamSerializer(read_only=True, many=True)

...

def get_teams(self, obj):
    user_teams = UserTeam.objects.filter(
         user=self.context['request'].user,
         is_special=True
    )
    teams = [ut.team for ut in user_teams] 
    serializer = UserSerializer(instance=teams, many=True)
    return serializer.data

Или, пытаясь вытащить немного из БД:

def get_teams(self, obj):

    team_ids = UserTeam.objects.filter(
         user=self.context['request'].user,
         is_special=True
    ).values_list('team_id', flat=True)

    teams = Team.objects.filter(id__in=team_ids) 

    serializer = UserSerializer(instance=teams, many=True)

    return serializer.data
...