Django Rest 返回每个项目的相关项目
Django Rest returning related items for each item
我试图在类似的问题中找到答案,但 none 达到了我的期望。
我有 2 个模型:
class Artist(models.Model):
name = models.CharField(max_length=255)
music_type = models.CharField(max_lenght=50)
def __str__(self):
return self.name
class Event(models.Model):
event_name = models.CharField(max_length=255)
...
artists = models.ManyToManyField(Artist)
def __str__(self):
return self.event_name
我还有serializers.py
个文件:
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = '__all__'
class ArtistSerializer(serializers.ModelSerializer):
events = EventSerializer(source='event_set', many=True)
class Meta:
model = Artist
fields ='__all__'
ArtistSerializer
中的 event
允许我 return 艺术家参与的所有活动。
现在对于每个艺术家,如果他们曾经参加过同一活动,我想获得所有艺术家的列表。
例如我有 5 个艺术家 (A1...A5) 和 3 个事件 (E1...E3)
在事件 1 中:[A1,A3]
在事件 2 中:[A3,A4,A5,A2]
在赛事 3 中:[A2, A3]
So for A3 I would like to get list [A1,A4,A5,A2]
For A1: [A3]
For A2: [A3,A4,A5]
不幸的是,我在创建此查询时遇到了很大的问题,因为 SQL-查询和 ORM 机制在这种情况下看起来更复杂。有人可以帮我解决这个问题或给出解决方法的提示吗?
如果需要,我会分享更多代码
您可以查询直通模型以获取与事件相关的艺术家。这是 django 为建立 M2M 关系而创建的中间模型。
你有一个 ManyToManyField
它有一个 through
的属性,这是 M2M 模型。
因此,根据您的事件模型,您可以执行类似 Event.artists.through.objects.all()
的操作,并且您会看到 M2M 模型中的所有实例。
因此,要找出与给定事件相关联的艺术家,您可以查询相同的 table;
Event.artists.through.objects.filter(event_id=1).select_related('artist')
这将 return M2M 中属于事件 1 的所有对象。然后您可以从那里获取艺术家,或者只获取艺术家 ID Event.artists.through.objects.filter(event_id=1).values_list('artist_id, flat=True)
鉴于您评论中的场景...
如果您有艺术家,那么您可以 运行 查询以获取他们参加过的活动,然后 运行 使用这些活动 ID 的另一个查询。在第二个查询中,您希望获取不是您正在查看的当前艺术家的艺术家 ID。
# First get the events that the current artist has been in
event_ids = Event.artists.through.objects.filter(artist_id=1).values_list('event_id, flat=True)
# Then get the other artists who have been in the same events
other_artist_ids = Event.artists.through.objects.filter(event_id__in =event_ids).exclude(artist_id=1).values_list('artist_id, flat=True)
# or the full instances
other_artists = Event.artists.through.objects.filter(event_id__in =event_ids).exclude(artist_id=1).select_related('artist')
我试图在类似的问题中找到答案,但 none 达到了我的期望。
我有 2 个模型:
class Artist(models.Model):
name = models.CharField(max_length=255)
music_type = models.CharField(max_lenght=50)
def __str__(self):
return self.name
class Event(models.Model):
event_name = models.CharField(max_length=255)
...
artists = models.ManyToManyField(Artist)
def __str__(self):
return self.event_name
我还有serializers.py
个文件:
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = '__all__'
class ArtistSerializer(serializers.ModelSerializer):
events = EventSerializer(source='event_set', many=True)
class Meta:
model = Artist
fields ='__all__'
ArtistSerializer
中的 event
允许我 return 艺术家参与的所有活动。
现在对于每个艺术家,如果他们曾经参加过同一活动,我想获得所有艺术家的列表。
例如我有 5 个艺术家 (A1...A5) 和 3 个事件 (E1...E3) 在事件 1 中:[A1,A3]
在事件 2 中:[A3,A4,A5,A2]
在赛事 3 中:[A2, A3]
So for A3 I would like to get list [A1,A4,A5,A2]
For A1: [A3]
For A2: [A3,A4,A5]
不幸的是,我在创建此查询时遇到了很大的问题,因为 SQL-查询和 ORM 机制在这种情况下看起来更复杂。有人可以帮我解决这个问题或给出解决方法的提示吗?
如果需要,我会分享更多代码
您可以查询直通模型以获取与事件相关的艺术家。这是 django 为建立 M2M 关系而创建的中间模型。
你有一个 ManyToManyField
它有一个 through
的属性,这是 M2M 模型。
因此,根据您的事件模型,您可以执行类似 Event.artists.through.objects.all()
的操作,并且您会看到 M2M 模型中的所有实例。
因此,要找出与给定事件相关联的艺术家,您可以查询相同的 table;
Event.artists.through.objects.filter(event_id=1).select_related('artist')
这将 return M2M 中属于事件 1 的所有对象。然后您可以从那里获取艺术家,或者只获取艺术家 ID Event.artists.through.objects.filter(event_id=1).values_list('artist_id, flat=True)
鉴于您评论中的场景...
如果您有艺术家,那么您可以 运行 查询以获取他们参加过的活动,然后 运行 使用这些活动 ID 的另一个查询。在第二个查询中,您希望获取不是您正在查看的当前艺术家的艺术家 ID。
# First get the events that the current artist has been in
event_ids = Event.artists.through.objects.filter(artist_id=1).values_list('event_id, flat=True)
# Then get the other artists who have been in the same events
other_artist_ids = Event.artists.through.objects.filter(event_id__in =event_ids).exclude(artist_id=1).values_list('artist_id, flat=True)
# or the full instances
other_artists = Event.artists.through.objects.filter(event_id__in =event_ids).exclude(artist_id=1).select_related('artist')