Мне нужно объединить все группы, в которых находятся все люди.
вот модели:
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50, blank=True, null=True)
aka = models.CharField(max_length=50, blank=True, null=True)
bio = models.TextField(blank=True, null=True)
birthday = models.DateField(blank=True, null=True)
birth_place = models.CharField(max_length=80, blank=True, null=True)
photo = models.ImageField(blank=True, null=True)
location = models.CharField(max_length=80, blank=True, null=True)
gender_choices = [
('m', 'Male'),
('f', 'Female'),
('u', 'Unknown'),
]
gender = models.CharField(max_length=1 ,choices=gender_choices, default='u')
class Band(models.Model):
name = models.CharField(max_length=100)
past_names = models.CharField(max_length=180 , blank=True, null=True)
bio = models.TextField(blank=True, null=True)
origin_country = models.CharField(max_length=30 , blank=True, null=True)
location = models.CharField(max_length=80 , blank=True, null=True)
formed_in = models.IntegerField(blank=True, null=True)
genre = models.CharField(max_length=80, blank=True, null=True)
themes = models.CharField(max_length=80, blank=True, null=True)
members = models.ManyToManyField(Person)
Так как у одного человека может быть несколько диапазонов, а у группы может быть несколько участников, я предполагаю, что правильно создать отношение ManyToMany с моделью Person в модели Band
Конечно, создается таблица отношений, но как я использую эту таблицу в View, предполагая, что я хочу сделать запрос, подобный этому:
select
person.*,
band.*
from person
left join band_members on band_members.person_id = person.id
left join band on band.id = band_members.band_id
order by band_person.id
Итак, в моем представлении есть запрос, в котором перечислены все лица, и более простое представление с использованием меньшего сериализатора, чтобы показать только некоторую информацию о людях:
class PersonViewset(viewsets.ModelViewSet):
queryset = Person.objects.all()
serializer_class = PersonSerializer
def list(self, request, *args, **kwargs):
queryset = Person.objects.all()
serializer = SinglePersonSerializer(queryset, many=True)
return Response(serializer.data)
Окончательный результат для людей должно получиться примерно так:
{
"id": 1,
"first_name": "person1",
"last_name": "last_name1",
"aka": null,
"photo": null
"bands":[
"band1",
"band6"
]
},...