Json 排除Django中多个关系的记录

Json 排除Django中多个关系的记录,json,django,serialization,django-rest-framework,Json,Django,Serialization,Django Rest Framework,我有两个具有多对多关系的模型,如图所示: class Season(models.Model): name = models.CharField(max_length=255) total_weeks = models.IntegerField() active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_a

我有两个具有多对多关系的模型,如图所示:

class Season(models.Model):
    name = models.CharField(max_length=255)
    total_weeks = models.IntegerField()
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class League(models.Model):
    name = models.CharField(max_length=50)
    code = models.CharField(max_length=10, null=True)
    admin = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name='admin_id')
    users = models.ManyToManyField(settings.AUTH_USER_MODEL)
    season_set = models.ManyToManyField(Season, through='LeagueSeason')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        self.code = uuid.uuid4().hex[:6].upper()
        super(League, self).save(*args, **kwargs)

class LeagueSeason(models.Model):
    GANADOR = 1
    RESULTADO_EXACTO = 2

    Type = (
        (GANADOR, 'Escoger ganador'),
        (RESULTADO_EXACTO, 'Escoger resultado exacto'),
    )

    league = models.ForeignKey(League, on_delete=models.PROTECT, related_name='leagues_set')
    season = models.ForeignKey(Season, on_delete=models.PROTECT, related_name='season_set')
    season_type = models.IntegerField(choices=Type, default=GANADOR)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = "leagues_seasons"
    
    def __str__(self):
        return 'League {} - {}'.format(self.league.name, self.season.name)
我的季节连载器如下所示:

class LeagueSeasonSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeagueSeason
        fields = [
            'league_id',
            'season_type'
        ]

class SeasonsSerializer(serializers.ModelSerializer):
    season_set = LeagueSeasonSerializer(many = True)

    class Meta:
        model = Season
        fields = '__all__'
...
path('league/<int:id>/seasons/', SeasonsView.as_view()),
...
serializer = SeasonsSerializer(seasons, many=True, context={'league_id': league_id})
一切都很好,但当我提出请求时,我得到了以下结果:

[
    {
        "id": 1,
        "season_set": [
            {
                "league_id": 7,
                "season_type": 1
            },
            {
                "league_id": 8,
                "season_type": 2
            }
        ],
        "name": "2020 Season",
        "total_weeks": 21,
        "active": true,
        "created_at": "2020-10-08T11:40:26.131187-05:00",
        "updated_at": "2020-10-08T11:40:26.131209-05:00"
    },
    ...
]
序列化的数据是正确的,但是由于我在两个不同的联赛中有相同的赛季,我得到了与本赛季所有联赛相关的很多结果。有没有一种方法,我可以排除相关的结果,只返回与联赛相关的记录?集合将删除相关的“league_id=8”,因为我只请求了7中的那些,然后就这样结束了

        ...
        "season_set": [
            {
                "league_id": 7,
                "season_type": 1
            }
        ],
        ...
调用序列化程序的视图如下:

class SeasonsView(APIView):
    def get(self, request, id):
        try:
            league = League.objects.get(id=id)
            leagues = request.user.league_set.all()
            if(league not in leagues):
                return Response({'message': 'User is not enrolled in league.'}, status=status.HTTP_400_BAD_REQUEST)
            else:
                seasons = league.season_set.filter(active=True)
                serializer = SeasonsSerializer(seasons, many=True)
                return Response(serializer.data)
        except League.DoesNotExist:
            return Response({'message': 'League not found.'}, status=status.HTTP_404_NOT_FOUND)
my url.py调用视图的方式如下:

class LeagueSeasonSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeagueSeason
        fields = [
            'league_id',
            'season_type'
        ]

class SeasonsSerializer(serializers.ModelSerializer):
    season_set = LeagueSeasonSerializer(many = True)

    class Meta:
        model = Season
        fields = '__all__'
...
path('league/<int:id>/seasons/', SeasonsView.as_view()),
...
serializer = SeasonsSerializer(seasons, many=True, context={'league_id': league_id})
。。。
路径('league//seasons/',SeasonsView.as_view()),
...

我所做的是在相关序列化程序上添加一个序列化程序方法字段,并搜索特定记录

class SeasonsSerializer(serializers.ModelSerializer):
    settings = serializers.SerializerMethodField()

    class Meta:
        model = Season
        fields = '__all__'

    def get_settings(self, obj):
        settings = LeagueSeason.objects.filter(season__id=obj.id, league__id=self.context['league_id'])
        serializer = LeagueSeasonSerializer(settings, many=True).data
        return serializer
为了获取league_id,我在视图中发送了一个上下文变量,如下所示:

class LeagueSeasonSerializer(serializers.ModelSerializer):
    class Meta:
        model = LeagueSeason
        fields = [
            'league_id',
            'season_type'
        ]

class SeasonsSerializer(serializers.ModelSerializer):
    season_set = LeagueSeasonSerializer(many = True)

    class Meta:
        model = Season
        fields = '__all__'
...
path('league/<int:id>/seasons/', SeasonsView.as_view()),
...
serializer = SeasonsSerializer(seasons, many=True, context={'league_id': league_id})

我得到了我想要的json,但我不确定这是否是最好的方法。如果有人有其他方法,请告诉我。

你能提供视图和URL吗?@zhivko zaikov编辑了这篇文章以显示视图和URL。