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。